考虑一个包含姓名的数据库表格,有三行:
Peter
Paul
Mary
有没有简单的方法将这些内容转换成一个字符串:
Peter, Paul, Mary
?考虑一个包含姓名的数据库表格,有三行:
Peter
Paul
Mary
Peter, Paul, Mary
?有人建议使用递归CTE解决方案,但没有提供代码。下面的代码是递归CTE的一个示例。
请注意,尽管结果与问题匹配,但数据并不完全符合给定的描述,因为我假设您真正想要对行组进行操作,而不是表中的所有行。将其更改以匹配表中的所有行应由读者自己完成。
;WITH basetable AS (
SELECT
id,
CAST(name AS VARCHAR(MAX)) name,
ROW_NUMBER() OVER (Partition BY id ORDER BY seq) rw,
COUNT(*) OVER (Partition BY id) recs
FROM (VALUES
(1, 'Johnny', 1),
(1, 'M', 2),
(2, 'Bill', 1),
(2, 'S.', 4),
(2, 'Preston', 5),
(2, 'Esq.', 6),
(3, 'Ted', 1),
(3, 'Theodore', 2),
(3, 'Logan', 3),
(4, 'Peter', 1),
(4, 'Paul', 2),
(4, 'Mary', 3)
) g (id, name, seq)
),
rCTE AS (
SELECT recs, id, name, rw
FROM basetable
WHERE rw = 1
UNION ALL
SELECT b.recs, r.ID, r.name +', '+ b.name name, r.rw + 1
FROM basetable b
INNER JOIN rCTE r ON b.id = r.id AND b.rw = r.rw + 1
)
SELECT name
FROM rCTE
WHERE recs = rw AND ID=4
OPTION (MAXRECURSION 101)
我在家里没有访问SQL Server的权限,所以我猜想语法,但大致如下:
DECLARE @names VARCHAR(500)
SELECT @names = @names + ' ' + Name
FROM Names
SELECT @names = @names + CASE WHEN LEN(@names)=0 THEN '' ELSE ' ' END + Name FROM Names
。 - Tian van HeerdenSELECT @names = @names + ISNULL(' ' + Name, '')
- Vita1ijSELECT
VendorId, STRING_AGG(FirstName,',') UsersName
FROM Users
WHERE VendorId != 9
GROUP BY VendorId
您需要创建一个变量来保存最终结果,并选择它,就像这样。
DECLARE @char VARCHAR(MAX);
SELECT @char = COALESCE(@char + ', ' + [column], [column])
FROM [table];
PRINT @char;
SELECT CarNamesString = STUFF((
SELECT ',' + [Name]
FROM tbl_cars
FOR XML PATH('')
), 1, 1, '')
SELECT STRING_AGG(Name, ', ') AS CarNames
FROM tbl_TypeCar;
SELECT [Name],
GROUP_CONCAT(DISTINCT [Name] SEPARATOR ',')
FROM tbl_cars
一个可直接使用的解决方案,不需要额外添加逗号:
select substring(
(select ', '+Name AS 'data()' from Names for xml path(''))
,3, 255) as "MyList"
空列表将导致NULL值。
通常,您会将列表插入到表列或程序变量中:将255最大长度调整为您的需要。
(Diwakar和Jens Frandsen提供了不错的答案,但需要改进。)
使用XML帮助我将行分隔为逗号。对于多余的逗号,我们可以使用SQL Server的替换函数。不是添加逗号,而是使用AS 'data()'将行连接起来,并在稍后将其用逗号替换,如下所示:
REPLACE(
(select FName AS 'data()' from NameList for xml path(''))
, ' ', ', ')
SELECT STUFF((SELECT ', ' + name FROM [table] FOR XML PATH('')), 1, 2, '')
这里有一个示例:
DECLARE @t TABLE (name VARCHAR(10))
INSERT INTO @t VALUES ('Peter'), ('Paul'), ('Mary')
SELECT STUFF((SELECT ', ' + name FROM @t FOR XML PATH('')), 1, 2, '')
--Peter, Paul, Mary
除本答案外,读者需要了解特定领域的表格,例如车辆或学生。必须创建并填充数据以测试解决方案。
下面是一个示例,使用 SQL Server 的 "Information_Schema.Columns" 表。通过使用此解决方案,无需创建表格或添加数据。此示例为数据库中所有表格创建逗号分隔的列名列表。
SELECT
Table_Name
,STUFF((
SELECT ',' + Column_Name
FROM INFORMATION_SCHEMA.Columns Columns
WHERE Tables.Table_Name = Columns.Table_Name
ORDER BY Column_Name
FOR XML PATH ('')), 1, 1, ''
)Columns
FROM INFORMATION_SCHEMA.Columns Tables
GROUP BY TABLE_NAME