【问题标题】:T-SQL query to replace special characters with a specific character用特定字符替换特殊字符的 T-SQL 查询
【发布时间】:2021-05-25 12:38:44
【问题描述】:

我正在使用SQL Server 2014 并且我有以下T-SQL 查询:

select p9.[Name]
from [CleanGuestNames] p outer apply
     (select replace(p.[Name], '@', '*') as [Name]) p1 outer apply
     (select replace(p1.[Name], '&', '*') as [Name]) p2 outer apply
     (select replace(p1.[Name], '\', '*') as [Name]) p3 outer apply
     (select replace(p1.[Name], '?', '*') as [Name]) p4 outer apply
     (select replace(p1.[Name], '/', '*') as [Name]) p5 outer apply
     (select replace(p1.[Name], ':', '*') as [Name]) p6 outer apply
     (select replace(p1.[Name], ';', '*') as [Name]) p7 outer apply
     (select replace(p1.[Name], '.', '*') as [Name]) p8 outer apply
     (select replace(p2.[Name], ',', '*') as [Name]) p9 ;

上面的代码应该用 [Name] 列中的 * 替换其中提到的所有字符。

当我运行查询时,我仍然从 [Name] 列中得到如下记录:

Alex / Sandrine SINNOF / VAN ACK
Peter / Jane KELLY

预期结果:

Alex * Sandrine SINNOF * VAN ACK
Peter * Jane KELLY

我在这里做错了什么?

【问题讨论】:

  • 因为您一直在替换 p1.[Name],而不是 p1.[Name],然后是 p2.[Name],然后是 p3.[Name]。不过,就我个人而言,我建议只嵌套 REPLACE 函数。如果您使用的是完全受支持的 SQL Server 版本,那么TRANSLATE 将是一个更好的选择。
  • @Larnu 非常感谢!傻我!

标签: sql-server tsql special-characters


【解决方案1】:

正如评论中提到的,这确实是一个印刷错误,因为您一直在引用 p1.[name],所以最后您只删除了字符 @&,。你需要推荐p2.[name]p3.[name]等:

select p9.[Name]
from dbo.[CleanGuestNames] p outer apply
     (select replace(p.[Name], '@', '*') as [Name]) p1 outer apply
     (select replace(p1.[Name], '&', '*') as [Name]) p2 outer apply
     (select replace(p2.[Name], '\', '*') as [Name]) p3 outer apply
     (select replace(p3.[Name], '?', '*') as [Name]) p4 outer apply
     (select replace(p4.[Name], '/', '*') as [Name]) p5 outer apply
     (select replace(p5.[Name], ':', '*') as [Name]) p6 outer apply
     (select replace(p6.[Name], ';', '*') as [Name]) p7 outer apply
     (select replace(p7.[Name], '.', '*') as [Name]) p8 outer apply
     (select replace(p8.[Name], ',', '*') as [Name]) p9;

不过,我个人建议嵌套所有 REPLACE 函数:

SELECT R.[Name]
FROM dbo.CleanGuestNames CGN
     CROSS APPLY (VALUES(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(p.[name],'@',''),'&',''),'\',''),'?',''),'/',''),':',''),';',''),'.',''),',','')))R([Name]);

如果您使用的是受支持的 SQL Server 版本,则可以使用 TRANSLATE 使其更简洁:

SELECT T.[Name]
FROM dbo.CleanGuestNames CGN
     CROSS APPLY (VALUES(REPLACE(TRANSLATE(p.[name],'@&\?.:;.',',,,,,,,,'),',','')))T([Name]);

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 2015-07-10
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多