LISTAGG
📄字数 868
👁️阅读量 加载中...
功能描述
将某个表中多个行的指定列值合并为一个字符串,通过指定分隔符连接。
语法格式
sql
LISTAGG ([ DISTINCT | ALL ] expr1[,expr2])
[WITHIN GROUP (order_by_clause)]
[OVER ([analytic_clause])]输入参数
expr1:列名或表达式,用来指定输入数据。expr2:可选参数,VARCHAR类型,或能隐式转换为VARCHAR类型的其他类型,分隔符,默认无分隔符,expr1直接连接。OVER ([analytic_clause]):可选的分析子句,支持分组子句,排序子句以及范围子句,详情见analytic_clause。WITHIN GROUP (order_by_clause):可选的子句,用于指定组合的元素的排序顺序。
输出结果
VARCHAR 类型,expr1为 NULL,返回 NULL,指定分隔符为 NULL,输出结果为不带分隔符的合并字符串。
注意
LISTAGG函数可以在OVER和WITHIN GROUP子句中同时指定排序,此时排序结果以WITHIN GROUP子句中的排序结果为准。
示例
sql
-- 建表并插入数据
SQL> CREATE TABLE emp
(
empno INT PRIMARY KEY,
ename VARCHAR(10),
deptno INT,
sal DECIMAL(10,2),
hiredate DATE
);
SQL> INSERT INTO emp VALUES
(7369, 'SMITH', 20, 800, TO_DATE('17-12-1980', 'DD-MM-YYYY')),
(7499, 'ALLEN', 30, 1600, TO_DATE('20-2-1981', 'DD-MM-YYYY')),
(7521, 'WARD', 30, 1250, TO_DATE('22-2-1981', 'DD-MM-YYYY')),
(7566, 'JONES', 20, 2975, TO_DATE('2-4-1981', 'DD-MM-YYYY')),
(7654, 'MARTIN', 30, 1250, TO_DATE('28-9-1981', 'DD-MM-YYYY'));
-- 将指定列值合并为一个字符串
SQL> SELECT deptno, LISTAGG(ename, ', ') WITHIN GROUP (ORDER BY hiredate) FROM emp GROUP BY deptno;
+--------+---------------------+
| DEPTNO | EXPR1 |
+--------+---------------------+
| 20 | SMITH, JONES |
| 30 | ALLEN, WARD, MARTIN |
+--------+---------------------+