SQL中如何通过变量累加拼接列的非重复元素?
解决SQL Server中拼接非重复列值的问题
嘿,这个坑我之前踩过!直接在select后面加distinct和变量累加一起用确实不会生效,因为SQL Server里这种变量逐行累加的逻辑,和distinct的执行顺序不对——它会先把所有行的值都累加到变量里,再去重,这时候早就晚啦。
给你两种可行的解决办法:
方法一:先去重再拼接(兼容旧版SQL Server)
先通过子查询把Column的非重复值筛选出来,再对这个干净的结果集做变量累加:
declare @car varchar(max)=''; select @car+=QUOTENAME(Column)+',' from (select distinct Column from TABLE) as DistinctColumns set @car = SUBSTRING(@car, 1, len(@car)-1) print @car
这样就能保证只有不重复的Column值被拼接到@car里了。
方法二:用STRING_AGG函数(SQL Server 2017+推荐)
如果你的SQL Server版本是2017及以上,用内置的STRING_AGG会更简洁,还不用手动处理最后多余的逗号:
declare @car varchar(max); select @car = STRING_AGG(QUOTENAME(Column), ',') from (select distinct Column from TABLE) as DistinctColumns print @car
这个函数专门用来做字符串聚合,直接就能把去重后的列值按指定分隔符拼接好,省心多了。
简单总结下:核心思路就是先对数据源去重,再执行拼接操作,而不是把去重和拼接混在一起做~
内容的提问来源于stack exchange,提问作者Songo
相关产品推荐
相关产品推荐

