姓名、身份证号以及银行卡号等属于个人敏感信息。为了保护个人隐私,我们在前端界面显示时可能需要将这些信息中的部分内容进行隐藏,也就是显示为星号(*)。
以医院排队叫号系统为例,屏幕上通常会隐藏患者的姓氏(对于两个字的姓名)或者名字中的倒数第2个字(对于三个或更多字的姓名),例如“*三”或者“李*亮”。
姓名处理
对姓名字段进行隐藏处理,显示规则:
a.姓名为2个字符的,隐藏姓,只显示名。例如 '张三' 处理后为 '*三'
b.姓名为3个字符的,隐藏中间一个字符。例如 '阿凡提' 处理后为 '阿*提'
c.姓名为4个字符及以上的,隐藏最后两个字符。例如 '尼格买提' 处理后为 '尼格**'
实现SQL:
SELECT t.emp_name AS "原始值",LENGTH(t.emp_name) "字符个数",
CASE LENGTH(t.emp_name)
WHEN 2 THEN '*'||SUBSTR(t.emp_name,2,1)
WHEN 3 THEN SUBSTR(t.emp_name,1,1)||'*'||SUBSTR(t.emp_name,3,1)
ELSE SUBSTR(t.emp_name,1,LENGTH(t.emp_name) -2)||'**'
END AS "隐藏后值"
FROM employee t
执行结果:
SQL分析:
LENGTH(str)函数,返回字符串str包含的字符数量。
SUBSTR(str,n,m)函数,发返回从位置n开始的m个字符。
手机号码处理
对手机进行隐藏处理,显示规则:
11位的手机号码,中间四位隐藏,其余正常显示。
实现SQL:
SELECT t.mobile_phone AS "隐藏之前",
SUBSTR(t.mobile_phone,1,3) ||'****' || SUBSTR(t.mobile_phone,8,4) AS "隐藏之后"
FROM emp_contact t
执行结果:
SQL分析:
SUBSTR使用两次,分别获取到前3位和后4位,中间用星号代替。
身份证号码处理
对身份证号码进行隐藏处理,显示规则:
18位的身份证号码,中间年月日的8位隐藏,其余正常显示。
实现SQL:
SELECT t.id_card AS "隐藏之前",
SUBSTR(t.id_card,1,6) ||'********' || SUBSTR(t.id_card,15,4) AS "隐藏之后"
FROM emp_contact t
执行结果:
SQL分析:
SUBSTR使用两次,分别获取到前6位和后4位,中间用星号代替。