如何在SQL中将查询结果合并显示为单行?
如何在SQL中将查询结果合并至单行
嘿,我来帮你搞定把SQL查询结果合并到同一行的需求!不同的数据库系统有不同的实现函数,我给你整理了几种最常用的场景和对应的写法:
MySQL/MariaDB:用GROUP_CONCAT()
这是MySQL系最常用的聚合函数,能把分组内的字符串拼接成单行。举个例子:假设你有个products表,想把同一分类下的产品名合并成逗号分隔的字符串:
SELECT category, GROUP_CONCAT(product_name SEPARATOR ', ') AS merged_products FROM products GROUP BY category;
- 要是想去掉重复值,加个
DISTINCT就行:GROUP_CONCAT(DISTINCT product_name SEPARATOR ', ') - 默认有长度限制,如果拼接后的字符串太长,可以调整
group_concat_max_len参数,或者用CAST转换类型扩大容量。
PostgreSQL:用STRING_AGG()
PostgreSQL的这个函数用法很直观,还支持排序:
SELECT category, STRING_AGG(product_name, ', ' ORDER BY product_name) AS merged_products FROM products GROUP BY category;
同样支持去重:STRING_AGG(DISTINCT product_name, ', ')
SQL Server:分版本选择
- SQL Server 2017及以后:直接用
STRING_AGG(),和PostgreSQL用法差不多:
SELECT category, STRING_AGG(product_name, ', ') AS merged_products FROM products GROUP BY category;
- 旧版本(2016及以前):得用
STUFF配合FOR XML PATH的组合写法:
SELECT p1.category, STUFF( (SELECT ', ' + p2.product_name FROM products p2 WHERE p2.category = p1.category FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '' ) AS merged_products FROM products p1 GROUP BY p1.category;
Oracle:用LISTAGG()
Oracle 11g及以后支持这个函数,还能指定排序规则:
SELECT category, LISTAGG(product_name, ', ') WITHIN GROUP (ORDER BY product_name) AS merged_products FROM products GROUP BY category;
如果需要去重,Oracle 12cR2及以后可以加DISTINCT:LISTAGG(DISTINCT product_name, ', ') WITHIN GROUP (...)
一些额外提示
- 分隔符可以自定义,比如用
' | '代替逗号,只要替换函数里的分隔符参数就行。 - 大多数函数会自动忽略
NULL值,不用额外处理。 - 如果是单表无分组的全局拼接,去掉
GROUP BY子句就行(比如把所有产品名合并成一行)。
如果你的数据库不在上面的列表里,或者有特殊的拼接需求,随时告诉我具体场景,我再帮你调整方案!
内容的提问来源于stack exchange,提问作者user3491260
相关产品推荐
相关产品推荐

