在SQL语句(或过程)中,我想将此表的行折叠为一个逗号分隔的字符串。将SELECT的行折叠为字符串的最佳方式是什么?
simpleTable
id value
-- -----
1 "a"
2 "b"
3 "c"
崩溃:
"a, b, c"
在SQL语句(或过程)中,我想将此表的行折叠为一个逗号分隔的字符串。将SELECT的行折叠为字符串的最佳方式是什么?
simpleTable
id value
-- -----
1 "a"
2 "b"
3 "c"
崩溃:
"a, b, c"
您可以在查询串联使用嵌入的 '设置' 声明:
declare @combined varchar(2000) select @combined = isnull(@combined + ', ','') + isnull(value,'') from simpleTable print @combined
(注意,第一个ISNULL()初始化字符串,而第二个isnull()尤其重要,如果'值'列中有任何空值的情况,否则单个空值可能会消除整个级联)
(评论后编辑的代码和说明)
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
这只会在MSSQL工作2005+
select value + ',' from simpletable for xml path ('')
..one方法,以防止多余的逗号:
select case(row_number() over (order by id))
when 1 then value else ',' + value end
from simpletable
for xml path ('')
这是基于@codeulike的答案,但会防止在连接空值“值”之前丢失连接的字符串部分。
declare @combined varchar(2000)
select @combined = isnull(@combined + ', ','') + ISNULL(value,'')
from simpleTable
print @combined
甜美!我没有意识到你可以做到这一点。我总是认为设置和选择工作是一样的分配。 – 2009-05-05 02:18:03
你可能希望使它成为“+ ISNULL(value,'')”,因为“+ value”会将空字符串的任何部分清零,并且空值为 – 2009-05-05 20:42:20