【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行
四大数据库多行合并为单行:函数详解与对比
- 一、MySQL
- **`GROUP_CONCAT()`** 函数说明:
- 语法结构:
- 参数解释:
- 示例:
- 注意事项:
- 二、Oracle
- **`LISTAGG()`** 函数说明:
- 语法结构:
- 参数解释:
- 示例:
- 注意事项:
- 三、SQL Server
- **`STRING_AGG()`** 函数说明:
- 语法结构:
- 参数解释:
- 示例:
- 旧版本替代方案:
- 四、PostgreSQL
- **`STRING_AGG()`** 函数说明:
- 语法结构:
- 参数解释:
- 示例:
- 特殊用法:
- 对比总结表格
一、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大对象支持 |
分隔符默认值 | 逗号 | 无(必须显式指定) | 无(必须显式指定) | 无(必须显式指定) |
可根据实际场景选择最合适的实现方案,建议优先使用各数据库的官方推荐聚合函数。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/51125.html
如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!