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

发布于:2025-03-05 ⋅ 阅读:(303) ⋅ 点赞:(0)

一、MySQL

GROUP_CONCAT() 函数说明:
  • 将分组后的多行数据按指定分隔符合并为单行字符串,支持去重、排序和自定义分隔符。
语法结构:
GROUP_CONCAT(
  [DISTINCT] 列名 
  [ORDER BY 排序列 [ASC|DESC]] 
  [SEPARATOR '分隔符']
)
参数解释:
  • DISTINCT:可选,对结果去重
  • ORDER BY:可选,控制合并顺序
  • SEPARATOR:可选,默认逗号分隔
示例:
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值,常用于行转列场景。
语法结构:
LISTAGG(列名 [, '分隔符']) 
  WITHIN GROUP (ORDER BY 排序列 [ASC|DESC])
参数解释:
  • 分隔符:可选,默认无分隔符
  • WITHIN GROUP:必选,指定排序规则
示例:
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() 函数说明:
  • 将分组结果拼接为字符串,需预先排序,支持分隔符自定义。
语法结构:
STRING_AGG(列名, '分隔符') [WITHIN GROUP (ORDER BY 排序列)]
参数解释:
  • 分隔符:必选参数
  • WITHIN GROUP:可选,2017版本后支持排序
示例:
SELECT 
  username,
  STRING_AGG(coursename, ',') WITHIN GROUP (ORDER BY score DESC) AS courses
FROM t_user_course
GROUP BY username;
旧版本替代方案:
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子句使用。
语法结构:
STRING_AGG(列名, '分隔符' [ORDER BY 排序列])
参数解释:
  • 分隔符:必选参数
  • ORDER BY:直接内联排序控制
示例:
SELECT 
  username,
  STRING_AGG(coursename, '|' ORDER BY course_id) AS courses
FROM t_user_course
GROUP BY username;
特殊用法:
-- 配合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大对象支持
分隔符默认值 逗号 无(必须显式指定) 无(必须显式指定) 无(必须显式指定)
可根据实际场景选择最合适的实现方案,建议优先使用各数据库的官方推荐聚合函数。