首页 > 解决方案 > 删除列中的重复文本

问题描述

在我的临时表中,我有一列用于列出可能重复的电子邮件地址。例如:

Row#1: test@gmail.com; test@gmail.com; test@yahoo.com; abc@gmail.com
Row#2: abc@yahoo.com; abcde@yahoo.com; abcde@yahoo.com

期望的结果:

Row#1: test@gmail.com; test@yahoo.com; abc@gmail.com
Row#2: abc@yahoo.com; abcde@yahoo.com

有没有办法在 SQL Server 语言中实现这一点?

标签: sqlsql-servertsql

解决方案


好吧,假设 SQL Server 2017,并且您有一个键列(或列组合),您可以同时使用STRING_SPLITand STRING_AGG

WITH CTE AS
(
    SELECT  DISTINCT 
                T.KeyColumn,
                E.Value Email
    FROM dbo.YourTable T
    OUTER APPLY STRING_SPLIT(Email,';') E
)
SELECT  KeyColumn,
        STRING_AGG(Email,';') Email
FROM CTE
GROUP BY KeyColumn
;

SQL Server 2016 更新:

没有STRING_AGG,您将不得不使用一种旧方法;例如:

WITH CTE AS
(
    SELECT  DISTINCT 
                T.KeyColumn,
                E.Value Email
    FROM dbo.YourTable T
    OUTER APPLY STRING_SPLIT(Email,';') E
)
SELECT  t.KeyColumn,
        Email = STUFF(( SELECT ';' + CONVERT(varchar(255),Email)
                        FROM CTE
                        WHERE KeyColumn = t.KeyColumn
                        FOR XML PATH(''), TYPE).value('.[1]','nvarchar(max)'),1,1,'')
FROM CTE t
GROUP BY t.KeyColumn
;

推荐阅读