2017年前的sql server的string_agg

时间:2018-03-19 10:47:51

标签: sql sql-server string-aggregation

任何人都可以帮助我使这个查询适用于sql server 2014.这适用于Postgresql,可能在sql server 2017上。在Oracle上它是listagg而不是string_agg。

这是sql:

select 
string_agg(t.id,',') AS id
from Tabel t

我在网站上检查了一些xml选项应该被使用但我无法理解。

2 个答案:

答案 0 :(得分:9)

在2017年之前的SQL Server中,您可以执行以下操作:

select stuff( (select ',' + cast(t.id as varchar(max))
               from tabel t
               for xml path ('')
              ), 1, 1, ''
            );

stuff()的唯一目的是删除初始逗号。这项工作由for xml path完成。

答案 1 :(得分:1)

请注意,对于某些字符,使用FOR XML PATH时这些值将被转义,例如:

SELECT STUFF((SELECT ',' + V.String
              FROM (VALUES('7 > 5'),('Salt & pepper'),('2
lines'))V(String)
              FOR XML PATH('')),1,1,'');

这将返回以下字符串:

7 > 5,Salt & pepper,2
lines'

这不太可能实现。您可以使用TYPE解决这个问题,然后获取XML的值:

SELECT STUFF((SELECT ',' + V.String
              FROM (VALUES('7 > 5'),('Salt & pepper'),('2
lines'))V(String)
              FOR XML PATH(''),TYPE).value('(./text())[1]','varchar(MAX)'),1,1,'');

这将返回以下字符串:

7 > 5,Salt & pepper,2
lines