首页 / SQL Server / 正文

[SQL Server]SQL Server中如何将一个表中的一列(多行)连接成一行字符串?

4304 发布于: 2018-01-03 读完约需8分钟

问题描述

SQL Server中如何将一个表中的一列(多行)连接成一行字符串?
比如有如下表格及数据(Students)表:

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

我们希望通过SQL查询语句查询到如下的结果:

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

以上的需求如果使用SQL Server语句应该如何实现呢?

方式一、使用 XML PATH

SQL Server 2005+中,可以使用 XML PATH 来实现,如下:

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 ('')
            ) [Students]
        From dbo.Students ST2
    ) [Main]

或者:

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 ('')
        ), 2, 1000) [Students]
From dbo.Students ST2

方式二、使用COALESCE

使用COALESCE, SQL Server语句:

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM People
WHERE Name IS NOT NULL

或者:

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + 
    ISNULL(Name, 'N/A')
FROM People

方式三、使用STUFF

SQL Server 2005+ 版本中,可以使用STUFF关键字,如下:

SELECT Stuff(
  (SELECT N', ' + Name FROM Names FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'')

方式四、使用 FOR JSON 语法

SQL Server 2016 版本中,可以使用 FOR JSON 语法,如下:

SELECT per.ID,
Emails = JSON_VALUE(
   REPLACE(
     (SELECT _ = em.Email FROM Email em WHERE em.Person = per.ID FOR JSON PATH)
    ,'"},{"_":"',', '),'$[0]._'
) 
FROM Person per

方式五、使用 STRING_AGG 关键字

SQL Server 2017 版本中,可以使用 STRING_AGG 关键字,如下:

1.不分组的情况:

SELECT STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department;

2.分组的情况:

SELECT GroupName, STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department
GROUP BY GroupName;

3.分组并按子串排序的情况:

SELECT GroupName, STRING_AGG(Name, ', ') WITHIN GROUP (ORDER BY Name ASC) AS Departments
FROM HumanResources.Department 
GROUP BY GroupName;

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: .NET[C#]如何将一个枚举序列化成对应的字符串?

下一篇: .NET[C#]如何计算两个日期之间的时间间隔(天数)?

本文永久链接码友网 » [SQL Server]SQL Server中如何将一个表中的一列(多行)连接成一行字符串?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册