逗号分隔结果在SQL中

Pri*_*ton 36 t-sql sql-server sql-server-2008

我有以下代码,它将为我的结果创建一个逗号分隔列表:

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+', ' ,'') + INSTITUTIONNAME
FROM EDUCATION
WHERE STUDENTNUMBER= '111'
SELECT @listStr
Run Code Online (Sandbox Code Playgroud)

问题在于它创建了一个大量逗号分隔的行.我需要它每行返回一个逗号分隔的列表.

所以,如果Simon已经成为2个机构的一部分,那么我希望:

"INSTITUTION1, INSTITUTION2"
Run Code Online (Sandbox Code Playgroud)

由于我没有提供where子句,我希望我的结果对于数据库中的每一行都显示如下.

Nit*_*esh 77

使用FOR XML PATH('')STUFF()如下所示为您提供相同的逗号分隔结果

SELECT  STUFF((SELECT  ',' + INSTITUTIONNAME
            FROM EDUCATION EE
            WHERE  EE.STUDENTNUMBER=E.STUDENTNUMBER
            ORDER BY sortOrder
        FOR XML PATH('')), 1, 1, '') AS listStr

FROM EDUCATION E
GROUP BY E.STUDENTNUMBER
Run Code Online (Sandbox Code Playgroud)

这是FIDDLE

  • 只是FYI-它的`FOR XML PATH('')`技巧可以获得分组聚合列,而不是STUFF - 在这种情况下它只是COALESCE的一个替代品,可以将字符串连接到最后一个 - 这是另一个例子:http://stackoverflow.com/questions/5452681/sql-aggregating-strings-together (4认同)
  • 您应该添加一个免责声明,表明“STRING_AGG”是现代受支持的 SQL Server 版本上的首选方法,并且“FOR XML PATH”仅应在“STRING_AGG”不能使用的情况下使用。 (3认同)
  • 我不能使用2012语法! (2认同)
  • [这里](http://stackoverflow.com/a/14374392/569436) 是一个答案,其中解释了这样的查询是如何工作的。`STUFF` 仅用于删除字符串开头的额外逗号。 (2认同)

Sim*_*ver 25

对于Sql Server 2017及更高版本,您可以使用新STRING_AGG功能

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql

以下示例使用"N/A"替换空值,并在单个结果单元格中返回以逗号分隔的名称.

SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv 
FROM Person.Person;
Run Code Online (Sandbox Code Playgroud)

这是结果集.

John,N/A,Mike,Peter,N/A,N/A,Alice,Bob
Run Code Online (Sandbox Code Playgroud)

也许更常见的用例是将组合在一起然后聚合,就像你想要的那样SUM,COUNT或者AVG.

SELECT a.articleId, title, STRING_AGG (tag, ',') AS tags 
FROM dbo.Article AS a       
LEFT JOIN dbo.ArticleTag AS t 
    ON a.ArticleId = t.ArticleId 
GROUP BY a.articleId, title;
Run Code Online (Sandbox Code Playgroud)


Xti*_*n11 6

这适用于 sql server 2016

USE AdventureWorks
GO
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + Name
FROM Production.Product
SELECT @listStr
GO
Run Code Online (Sandbox Code Playgroud)

  • 真的吗?我认为 SQL Server 2016 已经删除了允许您省略分号的错误功能。此外,OP的问题是关于生成一个逗号分隔的列表_每行_。你的代码无法做到这一点。 (2认同)

归档时间:

查看次数:

108262 次

最近记录:

6 年,2 月 前