在SQL Server中将多个结果合并为一个字符串

3

在SQL Server中是否有可能将多个结果合并为单个字符串?

我有以下表:

NameID Name
------ -----
1      Alvin
2      Alan
3      Ben
4      Tom

我该如何选择表格并返回以下所示的选择结果:
Group
-----
Alvin, Alan, Ben and Tom

2
可能是将数据库行转换为列的重复问题。 - RoMEoMusTDiE
告诉我们您使用的关系型数据库会很有帮助。在Oracle中,它是“listagg”,在SQL Server中,您可以使用“XML Path”来执行它,在MySQL中它是“GROUP_CONCAT”。 - Bryan Dellinger
始终为您使用的SQL Server版本添加标签是非常有帮助的。T-SQL随着每个版本的演进而不断发展,可能某些版本针对您的问题有不同的解决方案。 - TT.
4个回答

2
SQL Server 2017引入了STRING_AGG函数来简化这个过程:
SELECT STRING_AGG(Name,', ') FROM Table

这将返回:
Alvin, Alan, Ben, Tom

这里还有一个关于这些概念的好总结:SQL Server:将多行合并为单个字符串

If it is absolutely necessary to inject the and in the end, then we could use a replace last instance of routine:
NOTE: this level of formatting is much better managed in the rendering logic, not the SQL data logic.

SELECT STUFF(names,LastIndex,2,' and ') 
FROM (
    SELECT STRING_AGG(Name,', ') names  
    FROM Table
) as raw
CROSS APPLY (SELECT LEN(names)-CHARINDEX(' ,', REVERSE(names)) as LastIndex) as Helper

Returns:

Alvin, Alan, Ben and Tom

1
这里有一种使用FOR XML PATH的方法。
SELECT Stuff((SELECT ', ' + NAME
              FROM  Yourtable
              FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 

value 方法帮助我们在结果中避免对 xml 保留字符 进行编码。


1

试试这个:

  SELECT
  SUBSTRING((SELECT
    ',' + CAST(Name AS varchar)
  FROM table_name
  FOR xml PATH (''))
  , 2, 10000) AS Group1

enter image description here


由于缺少长度“cast”,Name将被截断为30个字符。如果名称列表大于10000个字符,会发生什么? - Pரதீப்

0

试试这个:

DECLARE @a TABLE
(Col1   int,
 Col2   varchar(5)
);
--
DECLARE @b  VARCHAR(500) = '';
--
INSERT INTO @a (Col1, Col2)
VALUES  (1,'Alvin'),
        (2,'Alan'),
        (3,'Ben'),
        (4,'Tom');
--
SELECT @b = COALESCE(@b,'') + Col2 + ', '
FROM @a;
--
SELECT STUFF(STUFF(@b, LEN(@b), 1, ''), LEN(@b) + 1 - CHARINDEX(',', REVERSE(STUFF(@b, LEN(@b), 1, ''))), 1, ' and')

输出:
Alvin,Alan,Ben和Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接