示例是在oralce示例數據庫中執行
如現有需求要查找每個部門中的員工
SELECT DEPTNO, ENAME FROM EMP;
這樣的結果並不是很直觀,我們希望同部門的顯示一行記錄
------------------------------------------字符串合並-----------------------------------------------------------
with x1 as (select deptno, ename, row_number() over (partition by deptno order by ename) as rn from emp) --select * from x1; ---用sys_connect_by_path合並字符串 select deptno,substr(sys_connect_by_path(ename,','),2) from x1 where connect_by_isleaf=1 start with rn=1 connect by (prior rn)=rn-1 and (prior deptno)=deptno
oralce11g可以改為listagg
select deptno,listagg(ename,',') within group (order by empno) from emp group by deptno;
很多人習慣用 wm_concat
但是它oracle一個未公開的內部函數,不同版本中返回類型也能存在差異(varchar或clob)
select deptno,wm_concat(ename) from emp group by deptno;
-------------------------------------------反操作-------------------------------------------------------------
with x2 as (select deptno,listagg(ename,',') within group (order by empno) as ename from emp group by deptno) select deptno,regexp_substr(ename,'[^,]+',1,level,'i') from x2 connect by level<=regexp_count(ename,',')+1 and (prior deptno)=deptno and (prior dbms_random.value()) is not null