在SQL Server中实现Email Address列的邮箱掩码显示方案
SQL Server 邮箱地址掩码实现方法
根据你的需求,需要保留邮箱@前部分的首尾字符,中间用*填充,@后部分保持不变。以下是用STUFF和REPLACE函数的具体实现方案:
一、使用STUFF函数实现
STUFF函数可对字符串指定位置的内容进行替换,核心思路是先拆分邮箱的前缀(@之前的部分),对前缀做掩码处理后再拼接后缀(@及之后的部分)。
完整SQL语句
SELECT [Email Address], CASE -- 处理前缀过短的情况(@前字符数≤1时不掩码) WHEN CHARINDEX('@', [Email Address]) <= 2 THEN [Email Address] ELSE -- 对前缀掩码:保留首尾字符,中间替换为* STUFF(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1), 2, LEN(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1)) - 2, REPLICATE('*', LEN(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1)) - 2)) -- 拼接@及后续部分 + SUBSTRING([Email Address], CHARINDEX('@', [Email Address]), LEN([Email Address])) END AS MaskedEmail FROM YourTableName;
逻辑说明
CHARINDEX('@', [Email Address]):获取@符号在邮箱字符串中的位置。LEFT([Email Address], CHARINDEX('@', ...)-1):提取@之前的前缀内容。STUFF(前缀, 2, 前缀长度-2, REPLICATE('*', 前缀长度-2)):从前缀第2个字符开始,替换掉中间前缀长度-2个字符为对应数量的*,保留首尾字符。SUBSTRING([Email Address], CHARINDEX('@', ...), LEN(...)):提取@及之后的后缀部分,直接拼接即可。
二、使用REPLACE函数实现
REPLACE函数通过替换前缀的中间部分为*实现掩码,同样需要先拆分前缀和后缀。
完整SQL语句
SELECT [Email Address], CASE WHEN CHARINDEX('@', [Email Address]) <= 2 THEN [Email Address] ELSE -- 替换前缀的中间部分为* REPLACE(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1), SUBSTRING(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1), 2, LEN(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1)) - 2), REPLICATE('*', LEN(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1)) - 2)) + SUBSTRING([Email Address], CHARINDEX('@', [Email Address]), LEN([Email Address])) END AS MaskedEmail FROM YourTableName;
逻辑说明
SUBSTRING(前缀, 2, 前缀长度-2):提取前缀中需要替换的中间部分(去掉首尾字符)。REPLACE(前缀, 中间部分, REPLICATE('*', 前缀长度-2)):将前缀的中间部分替换为对应数量的*,得到掩码后的前缀。- 最后拼接@及后缀部分,完成整个邮箱的掩码。
三、简化写法(无需区分函数)
如果不需要严格指定用STUFF或REPLACE,可以用更直观的拼接方式实现:
SELECT [Email Address], CASE WHEN CHARINDEX('@', [Email Address]) <= 2 THEN [Email Address] ELSE LEFT([Email Address], 1) -- 保留前缀第一个字符 + REPLICATE('*', LEN(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1)) - 2) -- 生成对应数量的* + RIGHT(LEFT([Email Address], CHARINDEX('@', [Email Address]) - 1), 1) -- 保留前缀最后一个字符 + SUBSTRING([Email Address], CHARINDEX('@', [Email Address]), LEN([Email Address])) -- 拼接后缀 END AS MaskedEmail FROM YourTableName;
测试结果
针对你的示例数据:
aaron0@adventure-works.com→a****0@adventure-works.comaaron1@adventure-works.com→a****1@adventure-works.comaaron14@adventure-works.com→a*****4@adventure-works.com
以上语句均可得到符合要求的掩码结果。
内容的提问来源于stack exchange,提问作者kaytee
相关产品推荐
相关产品推荐

