最近在开发过程中接触到了ORACLE新的函数,将满足条件查询的数据放到一行,并使用指定字符进行分隔。
一、是什么
LISTAGG() WITHIN GROUP()函数是一个聚合函数,它用于将多行的字符串值合并成一个单一的字符串。
语法:
LISTAGG(expression , delimiter) WITHIN GROUP (ORDER BY column)
- expression:要聚合的字符串表达式
- delimter:用于分隔合并后的字符串值的分隔符
- column:用于排序聚合字符串的列
选项
- WITHIN GROUP:这是必需的,用于指定聚合操作的分组方式
- ORDER BY:这是可选的,用于在聚合之前对行进行排序
溢出处理
- ON OVERFLOW:可选的,用于指定当结果超过最大长度限制时如何处理溢出。常见的选项有:
- TRUNCATE:截断结果,不包括最后一个分隔符。
- ERROR:如果结果超过最大长度,抛出错误。
- NULL:如果结果超过最大长度,返回NULL。
二、前提限制📌
⚠️ LISTAGG
仅支持 Oracle 11g R2 及以上版本,低版本需用 WM_CONCAT
(非官方)或 XML 方法替代。
三、示例
假设有一个员工表employees,现在要查询部门的员工数据
1.多列显示
select e.dept,e.name from employees e
2.单行显示
SELECT e.dept, listagg(e.name ,',') witnin group (order by e.name) as names
from employees e
group by e.dept
3.处理溢出 【如果聚合后的字符串超过了ORACLE的最大长度限制(默认4000字符)】
SELECT e.dept, listagg(e.name ,',') witnin group (order by e.name)
on overflow truncate as names
from employees e
group by e.dept
4.不排序
SELECT e.dept, listagg(e.name ,',') as names
from employees e
group by e.dept
5.包含NULL值【默认会忽略NULL值,如果你想在结果中包含NULL值,可以使用NULLIF函数进行转换】
SELECT e.dept, listagg(NULLIF(name,'NULL'), ',') as names
from employees e
group by e.dept
🏜小沈爱整理,后期敬请期待!