sql - 删除列中的重复文本
问题描述
在我的临时表中,我有一列用于列出可能重复的电子邮件地址。例如:
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 语言中实现这一点?
解决方案
好吧,假设 SQL Server 2017,并且您有一个键列(或列组合),您可以同时使用STRING_SPLIT
and 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
;
推荐阅读
- c - 如何在 Visual Studio 中使用“参数”运行 C 程序
- docker - 覆盖 Codeship 服务映像中的入口点
- azure-active-directory - .Net Core 使用 Azure AD 授权经过身份验证的用户
- docker - 两个容器之间的 Docker 卷
- bash - 使用 shell 遍历文件的内容
- node.js - 测试 Express.js 处理程序性能的最佳方法?
- javascript - 将图像永久存储在离线 web 应用中 [Android WebView]
- php - 将通过 file_get_contents 接收的字符串转换为 JSON 对象
- r - 根据 data.frame 中的逻辑向量逐行创建唯一组
- symfony - Symfony 4 - 控制台异常事件监听器