【发布时间】:2015-12-03 18:06:37
【问题描述】:
有什么方法可以选择第一个和最后两个字符并用 * 替换所有其他字符,如下所示?
WA***RT
EX*** ***IL
CH***ON
BE******* *****AY
AP*LE
提前致谢!
【问题讨论】:
-
但是你想保留空间?
-
如果可能我想保留空间
标签: sql sql-server
有什么方法可以选择第一个和最后两个字符并用 * 替换所有其他字符,如下所示?
WA***RT
EX*** ***IL
CH***ON
BE******* *****AY
AP*LE
提前致谢!
【问题讨论】:
标签: sql sql-server
跳过的空格:
SELECT
name,
[hidden] = CASE WHEN LEN(name) <= 4 THEN name
ELSE CONCAT(LEFT(name, 2),REPLICATE('*', LEN(name)- 2),RIGHT(name,2))
END
FROM #tab;
如果您需要空格并且只有一个可以使用:
SELECT name,
[hidden] = CASE
WHEN LEN(name) <= 4 THEN name
WHEN CHARINDEX(' ', name) > 0
THEN STUFF(CONCAT(LEFT(name, 2),REPLICATE('*', LEN(name) - 2) ,
RIGHT(name,2)), CHARINDEX(' ', name),1, ' ')
ELSE CONCAT(LEFT(name, 2),REPLICATE('*', LEN(name) - 2) ,RIGHT(name,2))
END
FROM #tab;
如果您使用低于SQL Server 2012 的版本,则将字符串与+ 连接。
【讨论】:
LEN(name)- 4) 而不是LEN(name)- 2)(它目前添加了两个额外的 *s)
select left(col, 2) + REPLICATE('*',len(col)-4) + right(col,2) from table;
【讨论】:
您可以使用STUFF。
SELECT STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4))
这不会保留空格。
要保留 N 个空格,您可以再次使用 STUFF 简单地“添加空格”:
SELECT col,
masked =
coalesce(
-- handle 2 spaces
STUFF(STUFF(
STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4)),
CHARINDEX(' ', col), 1, ' '),
CHARINDEX(' ', col, CHARINDEX(' ', col)+1), 1, ' '),
-- handle 1 spaces
STUFF(
STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4)),
CHARINDEX(' ', col), 1, ' '),
-- normal masking
STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4)),
-- too short to mask
col
)
【讨论】: