T-SQL 查询用特定字符替换特殊字符
T-SQL query to replace special characters with a specific character
我正在使用 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]
,所以您最终只删除了字符 @
、&
,以及 ,
。您需要引用 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 服务器版本,您可以使用 TRANSLATE
:
使其更加简洁
SELECT T.[Name]
FROM dbo.CleanGuestNames CGN
CROSS APPLY (VALUES(REPLACE(TRANSLATE(p.[name],'@&\?.:;.',',,,,,,,,'),',','')))T([Name]);
我正在使用 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]
,所以您最终只删除了字符 @
、&
,以及 ,
。您需要引用 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 服务器版本,您可以使用 TRANSLATE
:
SELECT T.[Name]
FROM dbo.CleanGuestNames CGN
CROSS APPLY (VALUES(REPLACE(TRANSLATE(p.[name],'@&\?.:;.',',,,,,,,,'),',','')))T([Name]);