将SELECT行压缩成字符串的最佳方法是什么?

Jus*_*ner 6 sql sql-server

在SQL语句(或过程)中,我想将此表的行折叠为单个逗号分隔的字符串.

simpleTable

id  value
--  ----- 
1    "a"
2    "b"
3    "c"
Run Code Online (Sandbox Code Playgroud)

折叠为:

"a, b, c"
Run Code Online (Sandbox Code Playgroud)

cod*_*ike 6

您可以在查询中使用嵌入式"set"语句进行连接:

declare @combined varchar(2000)
select @combined = isnull(@combined + ', ','') + isnull(value,'')
from simpleTable

print @combined

(注意,第一个isnull()初始化字符串,第二个isnull()尤其重要,如果'value'列中有任何空值,否则单个null可能会消除整个串联)

(评论后编辑的代码和解释)

编辑(十年后):

SQL Server 2017引入了STRING_AGG()函数,该函数提供了连接不同行的字符串的官方方法.与其他聚合函数(如COUNT())一样,它可以与GROUP BY一起使用.

因此,对于上面的示例,您可以:

select string_agg(value, ', ')
from simpleTable
Run Code Online (Sandbox Code Playgroud)

如果您有其他列并且想要连接该列的值,则应添加"group by"子句,例如:

select someCategory, string_agg(value, ', ') as concatValues
from simpleTable
group by someCategory
Run Code Online (Sandbox Code Playgroud)

注意string_agg仅适用于SQL 2017及更高版本.


gor*_*rdy 5

这只适用于MSSQL 2005+

select value + ',' from simpletable for xml path ('')
Run Code Online (Sandbox Code Playgroud)

..防止额外逗号的一种方法:

select case(row_number() over (order by id))
when 1 then value else ',' + value end
from simpletable
for xml path ('')
Run Code Online (Sandbox Code Playgroud)