如何在 SQL Server 中将多行文本连接成单个文本字符串

新手上路,请多包涵

考虑一个包含名称的数据库表,其中包含三行:

 Peter
Paul
Mary

有没有一种简单的方法可以将其转换为 Peter, Paul, Mary 的单个字符串?

原文由 JohnnyM 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 450
2 个回答

如果您使用的是 SQL Server 2017 或 Azure,请参阅 Mathieu Renda 答案

当我尝试加入两个具有一对多关系的表时,我遇到了类似的问题。在 SQL 2005 中,我发现 XML PATH 方法可以很容易地处理行的连接。

如果有一个表叫 STUDENTS

 SubjectID       StudentName
----------      -------------
1               Mary
1               John
1               Sam
2               Alaina
2               Edward

我预期的结果是:

 SubjectID       StudentName
----------      -------------
1               Mary, John, Sam
2               Alaina, Edward

我使用了以下 T-SQL

 SELECT Main.SubjectID,
       LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
    (
        SELECT DISTINCT ST2.SubjectID,
            (
                SELECT ST1.StudentName + ',' AS [text()]
                FROM dbo.Students ST1
                WHERE ST1.SubjectID = ST2.SubjectID
                ORDER BY ST1.SubjectID
                FOR XML PATH (''), TYPE
            ).value('text()[1]','nvarchar(max)') [Students]
        FROM dbo.Students ST2
    ) [Main]

如果您可以在开头连接逗号并使用 substring 跳过第一个,那么您可以以更紧凑的方式执行相同的操作,因此您不需要执行子查询:

 SELECT DISTINCT ST2.SubjectID,
    SUBSTRING(
        (
            SELECT ','+ST1.StudentName  AS [text()]
            FROM dbo.Students ST1
            WHERE ST1.SubjectID = ST2.SubjectID
            ORDER BY ST1.SubjectID
            FOR XML PATH (''), TYPE
        ).value('text()[1]','nvarchar(max)'), 2, 1000) [Students]
FROM dbo.Students ST2

原文由 Ritesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

SQL Server 2017 或更高版本中,您可以使用 STRING_AGG() 函数生成 逗号分隔 值。请看下面的一个例子。

 SELECT
    VendorId, STRING_AGG(FirstName,',') UsersName
FROM Users
WHERE VendorId != 9
GROUP BY VendorId

在此处输入图像描述

原文由 sameer Ahmed 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进