You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:50:27