1. LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX)
- 基础用法:LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX),就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来;LISTAGG()其实可以把它当作SUM()函数来使用或者理解。
示例代码:
查询部门为20的员工列表:SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO = '20';
结果:
使用 listagg() WITHIN GROUP () 将多行合并成一行:
示例代码:
SELECT
T .DEPTNO,
LISTAGG (T .ENAME, ',') WITHIN GROUP (ORDER BY T .ENAME) NAMES
FROM SCOTT.EMP T
WHERE
T .DEPTNO = '20' GROUP BY T .DEPTNO
结果:
2.高级用法:over(partition by XXX)。在不使用Group by语句时候,也可以使用LISTAGG函数:
示例代码:
WITH TEMP AS(
SELECT 500 POPULATION, 'CHINA' NATION ,'GUANGZHOU' CITY FROM DUAL UNION ALL
SELECT 1500 POPULATION, 'CHINA' NATION ,'SHANGHAI' CITY FROM DUAL UNION ALL
SELECT 500 POPULATION, 'CHINA' NATION ,'BEIJING' CITY FROM DUAL UNION ALL
SELECT 1000 POPULATION, 'USA' NATION ,'NEW YORK' CITY FROM DUAL UNION ALL
SELECT 500 POPULATION, 'USA' NATION ,'BOSTOM' CITY FROM DUAL UNION ALL
SELECT 500 POPULATION, 'JAPAN' NATION ,'TOKYO' CITY FROM DUAL
)
SELECT POPULATION,
NATION,
CITY,
LISTAGG(CITY,',') WITHIN GROUP (ORDER BY CITY) OVER (PARTITION BY NATION) RANK
FROM TEMP
结果:
2. wm_concat(column)
介绍:其函数在Oracle 10g推出,在10g版本中,返回字符串类型,在11g版本中返回clob类型。括号里面的参数是列,而且可以是多个列的集合,也就是说在括号里面可以自由地用‘||’合并字符串
示例代码:
select aaa.aaa_id, wm_concat(aaa.line_id) as ids
from aaa
group by aaa.aaa_id;
结果:
3.sys_connect_by_path(column,<分隔符>)
介绍:其函数在Oracle 9i 版本中推出,用来合并链路的字符串。注意的是其一定要和connect by子句合用!
第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符。
示例:SYS_CONNECT_BY_PATH (column, ‘/’) START WITH CONNECT BY PRIOR
示例代码
SELECT * FROM STD_GB_XZQH ORDER BY code
结果:
现在我想要:‘北京市/市辖区/东城区’这种类型的数据。怎么办?
示例代码:
SELECT substr(SYS_CONNECT_BY_PATH (X. NAME, '/'),2) HJD,X.CODE
FROM STD_GB_XZQH X WHERE X.LEVNUM <> '4' START WITH X.PARENTCODE IS NULL
CONNECT BY PRIOR X.CODE = X.PARENTCODE
结果: