【发布时间】:2014-05-21 08:40:38
【问题描述】:
使用 Oracle SQL,如何将某些数字替换为“X”。
例如,如果我有一个随机的手机号码:
0400 100 200 or 0400100200
我想将数字隐藏到:
0400 XXX XXX and 0400XXXXXX
我曾尝试使用 TRANSLATE,但不确定这是否是最佳方法。
【问题讨论】:
使用 Oracle SQL,如何将某些数字替换为“X”。
例如,如果我有一个随机的手机号码:
0400 100 200 or 0400100200
我想将数字隐藏到:
0400 XXX XXX and 0400XXXXXX
我曾尝试使用 TRANSLATE,但不确定这是否是最佳方法。
【问题讨论】:
你可以使用REGEX_REPLACE,例如
SELECT REGEXP_REPLACE(SUSBTR(PhoneNumber, 5), '[0-9]', 'X')
将第 4 个字符之后的所有数字替换为“X”,因此完整示例如下:
SELECT SUSBTR(PhoneNumber, 1, 4)
|| REGEXP_REPLACE(SUSBTR(PhoneNumber, 5), '[0-9]', 'X') AS Masked
FROM T;
正如评论中指出的,您也可以使用TRANSLATE,如下所示:
SELECT TRANSLATE(SUBSTR(PhoneNumber, 5), '0123456789', 'XXXXXXXXXX') AS TRANSLATE;
我对 Oracle 的实践经验很少,所以甚至无法猜测哪个会表现更好,但评论者 (Alex Poole) 在 Oracle 中的得分为 2.3k,而我的得分为 53。所以如果他建议TRANSLATE 会跑得更快,我不会争辩。我建议两者都尝试,然后选择对您的数据集运行最快的一个。
【讨论】:
手机号码示例:
1234567890
我的输出:
12xxxxxx90
SELECT
CONVERT(VARCHAR(20), SUBSTRING(CONVERT(VARCHAR(20),x.MobileNo),1,2)) +
'xxxxx' +
CONVERT(VARCHAR(20), SUBSTRING(CONVERT(VARCHAR(20),x.MobileNo),LEN(x.MobileNo) - 1, LEN(x.MobileNo)))
AS MobileNo
FROM TABLENAME x
【讨论】:
我更愿意给出答案:
String str = "12345678";
int len = str.length() - 3;
StringBuilder replace = new StringBuilder();
for(int i = 0; i < len; ++i)
replace.append( "X" );
replace.append( len >= 0 ? str.substring( len ) : "" );
【讨论】: