【问题标题】:SQL-Server: Replace except first and last charactersSQL-Server:替换第一个和最后一个字符除外
【发布时间】:2015-12-03 18:06:37
【问题描述】:

有什么方法可以选择第一个和最后两个字符并用 * 替换所有其他字符,如下所示?

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

提前致谢!

【问题讨论】:

标签: sql sql-server


【解决方案1】:

跳过的空格:

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 的版本,则将字符串与+ 连接。

【讨论】:

  • LiveDemo 的很棒的链接。我一定会使用它!
  • 以防万一有人看到这个并想在不检查的情况下复制+粘贴,LEN(name)- 4) 而不是LEN(name)- 2)(它目前添加了两个额外的 *s)
【解决方案2】:
select  left(col,  2) +   REPLICATE('*',len(col)-4) +   right(col,2)  from table;

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      相关资源
      最近更新 更多