SQL Server 2019中如何去除逗号分隔字符串重复值并更新表
在SQL Server 2019中去除逗号分隔列的重复值
针对你的需求,可以利用SQL Server 2017及以上版本支持的STRING_SPLIT和STRING_AGG函数实现,具体操作如下:
实现思路
- 用
STRING_SPLIT将BuildingNumbers列的逗号分隔字符串拆分为单独行记录 - 对拆分后的楼宇编号去重
- 借助
STRING_AGG将去重后的编号重新合并为逗号分隔的字符串 - 通过CTE(公共表表达式)关联原表,执行更新操作
具体SQL语句
请将语句中的YourTableName替换为你的实际表名:
WITH CleanedBuildings AS ( SELECT Id, -- 按数值排序合并,保证编号顺序符合预期 STRING_AGG(value, ',') WITHIN GROUP (ORDER BY CONVERT(INT, value)) AS UniqueBuildingNumbers FROM YourTableName -- 拆分逗号分隔的字符串 CROSS APPLY STRING_SPLIT(BuildingNumbers, ',') -- 按Id分组,确保每行的编号单独处理 GROUP BY Id ) -- 更新原表 UPDATE t SET t.BuildingNumbers = c.UniqueBuildingNumbers FROM YourTableName t INNER JOIN CleanedBuildings c ON t.Id = c.Id;
验证结果(可选)
执行更新前,建议先运行以下查询确认处理结果是否符合预期:
SELECT t.Id, t.PropertyNumber, c.UniqueBuildingNumbers FROM YourTableName t INNER JOIN ( SELECT Id, STRING_AGG(value, ',') WITHIN GROUP (ORDER BY CONVERT(INT, value)) AS UniqueBuildingNumbers FROM YourTableName CROSS APPLY STRING_SPLIT(BuildingNumbers, ',') GROUP BY Id ) c ON t.Id = c.Id;
注意事项
- 该方案仅适用于SQL Server 2017及以上版本(你的SQL Server 2019完全满足)
- 如果
BuildingNumbers包含非数字编号,可调整ORDER BY中的转换逻辑,或直接去掉ORDER BY(但可能打乱原顺序) - 若存在
BuildingNumbers为空字符串或NULL的行,语句会自动保留原状态
内容的提问来源于stack exchange,提问作者JoeCode
相关产品推荐
相关产品推荐

