如何用“X”屏蔽手机号码部分
Posted
技术标签:
【中文标题】如何用“X”屏蔽手机号码部分【英文标题】:How to mask a mobile phone number portion with 'X' 【发布时间】:2014-05-21 08:40:38 【问题描述】:使用 Oracle SQL,如何将某些数字替换为“X”。
例如,如果我有一个随机的手机号码:
0400 100 200 or 0400100200
我想将数字隐藏到:
0400 XXX XXX and 0400XXXXXX
我曾尝试使用 TRANSLATE,但不确定这是否是最佳方法。
【问题讨论】:
【参考方案1】:你可以使用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;
Example on SQL Fiddle
正如评论中指出的,您也可以使用TRANSLATE
,如下所示:
SELECT TRANSLATE(SUBSTR(PhoneNumber, 5), '0123456789', 'XXXXXXXXXX') AS TRANSLATE;
我对 Oracle 的实践经验很少,所以甚至无法猜测哪个会表现更好,但评论者 (Alex Poole) 在 Oracle 中的得分为 2.3k,而我的得分为 53。所以如果他建议TRANSLATE 会跑得更快,我不会争辩。我建议两者都尝试,然后选择对您的数据集运行最快的一个。
【讨论】:
或translate,它稍微不那么紧凑,但在大量数据上运行速度可能更快(如果这完全相关的话)。 我不确定我是否做过直接比较——这听起来像是我读过并假设是真的——but others have,根据数据的不同,结果参差不齐。除非您有大量数据和性能问题,否则可能不值得担心;我有点为时过早 *8-) 如果速度真的很重要,那么 OP 确实应该测试两者,否则使用你更舒服的那个。 我翻译了。谢谢。【参考方案2】:手机号码示例:
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
【讨论】:
欢迎来到 ***。虽然此代码可能会解决问题,但包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。【参考方案3】:我更愿意给出答案:
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 ) : "" );
【讨论】:
这看起来不太像 SQL。为什么要给出 Java 解决方案?以上是关于如何用“X”屏蔽手机号码部分的主要内容,如果未能解决你的问题,请参考以下文章