Oracle的LISTAGG
函数用于将多行数据合并成单个字符串,并使用指定的分隔符将其连接起来。其基本语法如下:
LISTAGG(column_name, delimiter) WITHIN GROUP (ORDER BY column_name)
其中:
-
column_name
:要合并的列名。 -
delimiter
:用于分隔连接的字符串。 -
ORDER BY column_name
:可选的子句,用于指定合并结果的排序顺序。
示例
假设我们有一个包含姓名和年龄字段的表employees
,我们可以使用LISTAGG
函数将所有姓名连接成一个字符串,如下所示:
SELECT LISTAGG(name, ', ') WITHIN GROUP (ORDER BY name) AS all_names FROM employees;
这将返回一个包含所有姓名的字符串,每个姓名之间以逗号加空格分隔,例如:"SMITH, JAMES, ADAMS, MARTIN, WARD, MILLER, TURNER, ALLEN, CLARK, BLAKE, JONES, FORD, SCOTT, KING"。
分组使用
LISTAGG
函数也可以用于分组数据。例如,如果我们想按部门对员工姓名进行分组并连接,可以这样做:
SELECT deptno, LISTAGG(name, ', ') WITHIN GROUP (ORDER BY name) AS all_names FROM employees GROUP BY deptno;
这将返回每个部门的员工姓名,按部门名称排序并以逗号加空格分隔,例如:
DEPTNO ALL_NAMES
10 MILLER, CLARK, KING
20 SMITH, ADAMS, JONES, FORD, SCOTT, JAMES, MARTIN, WARD, TURNER, ALLEN, BLAKE
分析函数用法
LISTAGG
函数还可以作为分析函数使用,例如,在窗口函数中:
SELECT deptno, ename, sal, LISTAGG(ename, ', ') WITHIN GROUP (ORDER BY sal) OVER (PARTITION BY deptno) AS names_per_dept
FROM emp;
这将返回每个部门中按薪水排序的员工姓名列表,例如:
DEPTNO ENAME SAL NAMES_PER_DEPT
10 MILLER 100 SMITH, CLARK, KING
20 SMITH 200 ADAMS, JONES, FORD, SCOTT, JAMES, MARTIN, WARD, TURNER, ALLEN, BLAKE
注意事项
-
LISTAGG
函数在Oracle 11g版本之后可用。如果使用的是较早版本的Oracle,可以考虑使用其他方法来实现类似的功能,如使用SYS_CONNECT_BY_PATH
函数或自定义聚合函数等。 -
delimiter
参数默认为空(NUL),如果需要使用其他分隔符,可以显式指定。