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

时间:2009-05-04 23:29:29

标签: sql sql-server

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

simpleTable

id  value
--  ----- 
1    "a"
2    "b"
3    "c"

折叠为:

"a, b, c"

4 个答案:

答案 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