【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大对象支持
分隔符默认值 逗号 无(必须显式指定) 无(必须显式指定) 无(必须显式指定)
复制代码
可根据实际场景选择最合适的实现方案,建议优先使用各数据库的官方推荐聚合函数。
相关推荐
lekami_兰6 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
蚕豆哥6 小时前
【2026马年重启】我的 Primavera P6/Unifier 技术笔记,继续更新!
ai·oracle·项目管理·unifier·p6·进度管理·甲骨文
认真的薛薛7 小时前
数据库-sql语句
数据库·sql·oracle
爱学英语的程序员7 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
·云扬·8 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql
码界筑梦坊9 小时前
330-基于Python的社交媒体舆情监控系统
python·mysql·信息可视化·数据分析·django·毕业设计·echarts
IT邦德9 小时前
RPM包快速安装Oracle26ai
数据库·oracle
千寻技术帮10 小时前
10327_基于SpringBoot的视频剪辑咨询网站
mysql·源码·springboot·代码·视频咨询
数据知道10 小时前
PostgreSQL 核心原理:系统内部的对象寻址机制(OID 对象标识符)
数据库·postgresql
失忆爆表症11 小时前
01_项目搭建指南:从零开始的 Windows 开发环境配置
windows·postgresql·fastapi·milvus