SQL-Server:替换除了第一个和最后一个字符

时间:2015-12-03 08:01:26

标签: sql sql-server

有没有办法选择第一个和最后两个字符并用*替换所有其他字符,如下所示?

WA***RT
EX*** ***IL
CH***ON
BE******* *****AY
AP*LE

提前致谢!

3 个答案:

答案 0 :(得分:2)

跳过空格:

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;

LiveDemo

如果使用的版本低于SQL Server 2012连接字符串+

答案 1 :(得分:0)

您可以使用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
    )

Demo

答案 2 :(得分:0)

select  left(col,  2) +   REPLICATE('*',len(col)-4) +   right(col,2)  from table;