SQL Server:实现逗号分隔字符串去重生成新列的查询方法
嘿,刚好碰到过类似的需求,在SQL Server里处理逗号分隔字符串去重其实不难,分版本给你几个实用的方案,你可以根据自己的SQL Server版本来选:
方法1:SQL Server 2017及以上版本(最简洁)
这个版本有STRING_AGG和STRING_SPLIT两个内置函数,直接组合用就搞定了,代码超简单:
SELECT Column_A, STRING_AGG(DISTINCT value, ',') AS Column_B FROM YourTable CROSS APPLY STRING_SPLIT(Column_A, ',') GROUP BY Column_A;
原理说明:
STRING_SPLIT(Column_A, ',')把逗号分隔的字符串拆成一行行的单个值;CROSS APPLY把原表的每一行和拆分后的多行结果关联起来;DISTINCT自动去掉重复的内容;STRING_AGG把去重后的单个值再用逗号拼接回字符串,就是你要的Column_B啦!
方法2:SQL Server 2016版本(有STRING_SPLIT但无STRING_AGG)
2016版本还没出STRING_AGG,那咱们用FOR XML PATH来拼接字符串:
SELECT Column_A, STUFF(( SELECT DISTINCT ',' + value FROM STRING_SPLIT(t.Column_A, ',') FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS Column_B FROM YourTable t;
原理说明:
- 同样先用
STRING_SPLIT拆分字符串; - 子查询里用
FOR XML PATH('')把去重后的单个值拼接成带开头逗号的字符串(比如,karim,rahim...); - 最后用
STUFF把开头多余的逗号去掉,就得到干净的结果了。
方法3:SQL Server 2016以下版本(无内置拆分函数)
如果你的SQL Server版本更老,连STRING_SPLIT都没有,那先自己写个拆分函数,再用上面的拼接逻辑:
第一步:创建自定义拆分函数
CREATE FUNCTION dbo.SplitString ( @InputString NVARCHAR(MAX), @Delimiter NVARCHAR(5) ) RETURNS @OutputTable TABLE (Value NVARCHAR(MAX)) AS BEGIN DECLARE @StartIndex INT, @EndIndex INT SET @StartIndex = 1 -- 确保字符串末尾有分隔符,避免漏拆最后一个值 IF SUBSTRING(@InputString, LEN(@InputString) - 1, LEN(@InputString)) <> @Delimiter BEGIN SET @InputString = @InputString + @Delimiter END WHILE CHARINDEX(@Delimiter, @InputString) > 0 BEGIN SET @EndIndex = CHARINDEX(@Delimiter, @InputString) INSERT INTO @OutputTable(Value) SELECT SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex) SET @InputString = SUBSTRING(@InputString, @EndIndex + 1, LEN(@InputString)) END RETURN END
第二步:用函数查询去重后的结果
SELECT Column_A, STUFF(( SELECT DISTINCT ',' + Value FROM dbo.SplitString(t.Column_A, ',') FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS Column_B FROM YourTable t;
你可以把上面的YourTable换成你实际的表名,测试一下你给的示例数据,肯定能得到你想要的结果!
内容的提问来源于stack exchange,提问作者Biddut
相关产品推荐
相关产品推荐

