如何在SQL Server中去除逗号分隔字符串的重复值(不使用函数)
解决SQL Server逗号分隔字符串去重(无需自定义函数)
你的思路其实很靠谱,用XML的distinct-values方法来实现去重是个简洁的方案,只是之前的代码里藏了个小细节错误——你替换分隔符时用的是, (逗号加空格),但原始字符串里的分隔符是纯逗号,,没有空格,这就导致XML节点没被正确拆分,自然没法完成去重。
直接给你修正后的完整可运行代码:
Declare @data varchar(max) = '34.22,768.55,34.22,123.34,12,999.0,999.0' SET @data = ( SELECT CAST( CAST('<d>' + REPLACE(@data, ',', '</d><d>') + '</d>' AS XML).query('distinct-values(/d)') AS varchar(max) ) ) SELECT @data AS 去重后的结果
修正点说明
- 把
replace(@data, ', ',',</d><d>')改成REPLACE(@data, ',', '</d><d>'),让每个纯逗号都被替换成XML节点的闭合+开启标签,这样原始字符串里的每个数值都会被拆分成独立的<d>节点。 - XML的
distinct-values()方法会自动剔除节点中的重复值,最后转换回varchar类型,就能得到你要的去重后字符串。
运行这段代码后,会直接输出预期结果:34.22,768.55,123.34,12,999.0
额外提个小补充:如果你的字符串后续可能包含<、&这类XML特殊字符,可以搭配FOR XML PATH('')做转义处理,但当前场景都是数值,上面的方案完全够用。
内容的提问来源于stack exchange,提问作者Ashwanth K A
相关产品推荐
相关产品推荐

