SQL Server中使用CAST/CASE无法将多行合并为单行字符串的问题
解决重复ID记录合并为单个字符串的问题
嘿,我来帮你搞定这个困扰!你说用了CAST或CASE的查询后,结果还是返回多行,这很正常——因为CAST只是做数据类型转换,CASE是用来处理条件逻辑,它们本身都不具备把多行记录合并成单个字符串的能力。要实现这个需求,得用对应数据库的字符串聚合拼接函数,再配合GROUP BY按ID分组才行。
下面给你列出常用数据库的解决方案,你可以根据自己用的数据库选对应的写法:
MySQL/MariaDB 写法
SELECT id, -- 用GROUP_CONCAT拼接,SEPARATOR指定分隔符,还可以加ORDER BY排序 GROUP_CONCAT(your_column SEPARATOR ', ') AS merged_string FROM your_table GROUP BY id;
SQL Server 2017及以上版本
SELECT id, -- STRING_AGG是官方推荐的拼接函数,简单直观 STRING_AGG(your_column, ', ') AS merged_string FROM your_table GROUP BY id;
SQL Server 2016及以下版本(兼容写法)
如果你的SQL Server版本比较旧,没有STRING_AGG,可以用FOR XML PATH来实现:
SELECT t.id, -- STUFF用来去掉开头多余的分隔符 STUFF(( SELECT ', ' + CAST(your_column AS NVARCHAR(MAX)) -- 数值类型要先转字符串 FROM your_table WHERE id = t.id FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS merged_string FROM your_table t GROUP BY t.id;
Oracle 写法
SELECT id, -- LISTAGG支持排序,WITHIN GROUP里可以指定排序规则 LISTAGG(your_column, ', ') WITHIN GROUP (ORDER BY your_column) AS merged_string FROM your_table GROUP BY id;
PostgreSQL 写法
SELECT id, STRING_AGG(your_column::TEXT, ', ') AS merged_string -- 非字符串类型转TEXT FROM your_table GROUP BY id;
几个注意点:
- 把上面的
your_table换成你的实际表名,your_column换成需要合并的字段名 - 如果要合并的字段是数值/日期类型,记得先转换成字符串类型(比如CAST、::TEXT)
- 可以根据需求调整分隔符(比如换成
;或者换行符CHAR(10)) - 如果需要合并后的字符串按特定顺序排列,在拼接函数里加上ORDER BY即可
内容的提问来源于stack exchange,提问作者GThree
相关产品推荐
相关产品推荐

