【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行

四大数据库多行合并为单行:函数详解与对比

一、MySQL

GROUP_CONCAT() 函数说明:
  • 将分组后的多行数据按指定分隔符合并为单行字符串,支持去重、排序和自定义分隔符。
语法结构:
sql 复制代码
GROUP_CONCAT(
  [DISTINCT] 列名 
  [ORDER BY 排序列 [ASC|DESC]] 
  [SEPARATOR '分隔符']
)
参数解释:
  • DISTINCT:可选,对结果去重
  • ORDER BY:可选,控制合并顺序
  • SEPARATOR:可选,默认逗号分隔
示例:
sql 复制代码
SELECT 
  username,
  GROUP_CONCAT(DISTINCT coursename ORDER BY coursename DESC SEPARATOR '|') AS courses
FROM t_user_course
GROUP BY username;
注意事项:
  • 默认最大长度由 group_concat_max_len 参数控制(默认1024字节)
  • 超长内容会被截断,可通过 SET group_concat_max_len=2048; 调整

二、Oracle

LISTAGG() 函数说明:
  • 将分组内数据按指定顺序和分隔符拼接为字符串,自动处理NULL值,常用于行转列场景。
语法结构:
sql 复制代码
LISTAGG(列名 [, '分隔符']) 
  WITHIN GROUP (ORDER BY 排序列 [ASC|DESC])
参数解释:
  • 分隔符:可选,默认无分隔符
  • WITHIN GROUP:必选,指定排序规则
示例:
sql 复制代码
SELECT 
  username,
  LISTAGG(coursename, ';') WITHIN GROUP (ORDER BY create_time) AS courses
FROM t_user_course
GROUP BY username;
注意事项:
  • 严格长度限制:返回结果不得超过 4000字符
  • 超长处理方案:
    CLOB类型:XMLAGG(XMLELEMENT(e, coursename, ',').EXTRACT('//text()')).GETCLOBVAL()

三、SQL Server

STRING_AGG() 函数说明:
  • 将分组结果拼接为字符串,需预先排序,支持分隔符自定义。
语法结构:
sql 复制代码
STRING_AGG(列名, '分隔符') [WITHIN GROUP (ORDER BY 排序列)]
参数解释:
  • 分隔符:必选参数
  • WITHIN GROUP:可选,2017版本后支持排序
示例:
sql 复制代码
SELECT 
  username,
  STRING_AGG(coursename, ',') WITHIN GROUP (ORDER BY score DESC) AS courses
FROM t_user_course
GROUP BY username;
旧版本替代方案:
sql 复制代码
SELECT 
  username,
  courses = STUFF((
    SELECT ',' + coursename 
    FROM t_user_course 
    WHERE username = a.username 
    FOR XML PATH('')
  ), 1, 1, '')
FROM t_user_course a
GROUP BY username;

四、PostgreSQL

STRING_AGG() 函数说明:
  • 聚合函数中灵活性最高,支持大文本(1GB限制),可配合FILTER子句使用。
语法结构:
sql 复制代码
STRING_AGG(列名, '分隔符' [ORDER BY 排序列])
参数解释:
  • 分隔符:必选参数
  • ORDER BY:直接内联排序控制
示例:
sql 复制代码
SELECT 
  username,
  STRING_AGG(coursename, '|' ORDER BY course_id) AS courses
FROM t_user_course
GROUP BY username;
特殊用法:
sql 复制代码
-- 配合DISTINCT使用
STRING_AGG(DISTINCT coursename, ',')
-- 配合FILTER子句
STRING_AGG(coursename, ',' ORDER BY ...) FILTER (WHERE score > 60)

对比总结表格

功能特性 MySQL Oracle SQL Server PostgreSQL
基础函数 GROUP_CONCAT() LISTAGG() STRING_AGG() STRING_AGG()
排序控制 ORDER BY子句内 WITHIN GROUP内 WITHIN GROUP子句 直接内联ORDER BY
去重支持 支持DISTINCT 需配合子查询 需配合子查询 支持DISTINCT
空值处理 自动跳过NULL 自动跳过NULL 自动跳过NULL 保留NULL占位
长度限制 受参数控制 4000字符硬限制 无明确限制 1GB大对象支持
分隔符默认值 逗号 无(必须显式指定) 无(必须显式指定) 无(必须显式指定)
可根据实际场景选择最合适的实现方案,建议优先使用各数据库的官方推荐聚合函数。
相关推荐
天地风雷水火山泽3 小时前
二百八十五、华为云PostgreSQL——建分区表并设置主键
数据库·postgresql·华为云
IT程序媛-桃子3 小时前
Oracle连接满了,无法登录数据库,如何分析连接来源?
数据库·oracle
Watink Cpper4 小时前
[MySQL初阶]MySQL(3)表的约束
linux·运维·服务器·数据库·mysql·表的约束
然子而4 小时前
苍穹外卖学习笔记(跳过微信支付)
java·spring boot·git·学习·mysql·maven·mybatis
Craaaayon4 小时前
Docker基础-常见命令与数据卷
java·数据库·后端·mysql·docker·容器·eureka
C-20024 小时前
mysql下载与安装
数据库·mysql
WeiLai11125 小时前
面试基础--MySQL SQL 优化深度解析
java·后端·sql·mysql·面试·架构
m0_742566606 小时前
Mysql下载安装
数据库·mysql
北顾南栀倾寒6 小时前
[杂学笔记]HTTP1.0和HTTP1.1区别、socket系列接口与TCP协议、传输长数据的时候考虑网络问题、慢查询如何优化、C++的垃圾回收机制
网络·c++·笔记·tcp/ip·mysql·http
爱老的虎油6 小时前
MySQL零基础教程16—表连接进阶
数据库·mysql