oracle中字符串合並與拆分


示例是在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM