我需要对一个有很多记录的表进行选择,以屏蔽帐号。
示例账号:12300012341234
输出结果应该看起来像12340001234XXXX
最后4位应该变成X。
到目前为止,我想出了这个
select SUBSTRING('XXXX', 0, 4 - len(RIGHT(AccNumber, 4))) + RIGHT(AccNumber, 4) from table
我错过什么了吗?
您也可以使用STUFF。它正是为这种类型的东西而设计的。我正在使用萨米发布的优秀样本数据。性能应该没有差异,但按键次数要少一点。:)另一个优点是,如果传入的帐户代码太短,它不会崩溃。它只会返回NULL。
declare @MyStrings TABLE (
STR VARCHAR(200)
);
INSERT INTO @MyStrings VALUES
('123400012341234'),
('123400012340000004321'),
('12340102');
select stuff(STR, len(STR) - 3, 4, 'xxxx')
from @MyStrings
SELECT
LEFT(AcctNumber, LEN(AcctNumber)-4) + 'XXXX'
FROM YourTable
或者,如果字符串长度是可变的,你会想避免它在短字符串上出错:
SELECT
CASE WHEN LEN(AcctNumber) > 4
THEN LEFT(AcctNumber, LEN(AcctNumber)-4) + 'XXXX'
ELSE 'XXXX'
END
FROM YourTable
或者,如果您非常确定帐号总是15个字符:
SELECT
LEFT(AcctNumber, 11) + 'XXXX'
FROM TABLE
下面是一个例子:
CREATE TABLE MyStrings (
STR VARCHAR(200)
);
INSERT INTO MyStrings VALUES
('123400012341234'),
('123400012340000004321'),
('12340102'),
('1');
SELECT CASE WHEN LEN(STR) >= 8 THEN SUBSTRING(STR, 1, LEN(STR)-4)+'XXXX' END AS Result
FROM MyStrings;
结果:
+-----------------------+
| Result |
+-----------------------+
| 12340001234XXXX |
| 12340001234000000XXXX |
| 1234XXXX |
| NULL |
+-----------------------+
尝试使用stuff函数,它更容易:
Select
AcctNumber=STUFF ( AcctNumber, (LEN(AcctNumber)-3), 4 , 'XXXX' )
from Table1
希望它能帮助你:)
我在ORACLE SQL上使用了这个查询来查找预期的输出;
创建表acc_study(acc_no int不为null);插入acc_study值(1234 00012341234);
选择长度(Acc_no),rpad(rpad(Acc_no,11,''),15,'')作为Acc_study的输出;
输出结果-12340001234XXXX