屏蔽帐号

时间:2017-11-21 19:39:14

标签: sql-server tsql

我需要对包含许多记录的表进行选择以掩盖帐号。

示例AccNumber:123400012341234

输出结果应该类似于12340001234XXXX

最后4位数字应该变成X.

到目前为止我想出了这个

select SUBSTRING('XXXX', 0, 4 - len(RIGHT(AccNumber, 4))) + RIGHT(AccNumber, 4) from table

我错过了什么吗?

4 个答案:

答案 0 :(得分:3)

你也可以使用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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

以下是一个例子:

['11.22.33.44', '11.11.12.11', '11.11.13.11', '11.11.14.0']

结果:

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;

答案 3 :(得分:0)

尝试使用功能更简单:

 Select 
 AcctNumber=STUFF ( AcctNumber, (LEN(AcctNumber)-3), 4 , 'XXXX' )
 from Table1

希望它可以帮助你:)