在SQL语句(或过程)中,我想将此表的行折叠为单个逗号分隔的字符串。
simpleTable
id value
-- -----
1 "a"
2 "b"
3 "c"
折叠为:
"a, b, c"
答案 0 :(得分:6)
您可以在查询中使用嵌入式“set”语句进行连接:
declare @combined varchar(2000) select @combined = isnull(@combined + ', ','') + isnull(value,'') from simpleTable print @combined
(注意第一个isnull()初始化字符串,第二个isnull()尤其重要,如果'value'列中有任何空值,否则单个null可能会消除整个串联)< / p>
(评论后的编辑代码和说明)
编辑(十年后):
SQL Server 2017引入了STRING_AGG()函数,该函数提供了连接不同行的字符串的官方方法。与其他聚合函数(如COUNT())一样,它可以与GROUP BY一起使用。
因此,对于上面的示例,您可以这样做:
select string_agg(value, ', ')
from simpleTable
如果您有其他列并且想要连接该列的值,则应添加“group by”子句,例如:
select someCategory, string_agg(value, ', ') as concatValues
from simpleTable
group by someCategory
注意string_agg仅适用于SQL 2017及更高版本。
答案 1 :(得分:5)
这只适用于MSSQL 2005 +
select value + ',' from simpletable for xml path ('')
..防止额外逗号的一种方法:
select case(row_number() over (order by id))
when 1 then value else ',' + value end
from simpletable
for xml path ('')
答案 2 :(得分:2)
DECLARE @EmployeeList varchar(100)
SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') +
CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1
SELECT @EmployeeList
结果:
1, 2, 4
答案 3 :(得分:0)
这是基于@codeulike的答案,但是会阻止在连接null“value”之前丢失连接的字符串部分。
declare @combined varchar(2000)
select @combined = isnull(@combined + ', ','') + ISNULL(value,'')
from simpleTable
print @combined