【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大对象支持
分隔符默认值 逗号 无(必须显式指定) 无(必须显式指定) 无(必须显式指定)
复制代码
可根据实际场景选择最合适的实现方案,建议优先使用各数据库的官方推荐聚合函数。
相关推荐
2301_771717211 天前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
绘梨衣5471 天前
Docker+FastAPI+MySQL 项目部署报错汇总
mysql·docker·fastapi
dvjr cloi1 天前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
czlczl200209251 天前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
俺不要写代码1 天前
数据库:函数
数据库·mysql
Ruci ALYS1 天前
MySQL大小写敏感、MySQL设置字段大小写敏感
数据库·mysql
Linsk1 天前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
@小柯555m1 天前
MySql(高级操作符--操作符混合运用)
数据库·sql·mysql
向風而行2 天前
MySQL详解
数据库·mysql
belldeep2 天前
本草纲目:如何应用 PostgreSQL 实现【中医药】主题数据库 ?
数据库·postgresql·本草纲目