oracle行轉列,列轉行函數的使用(listagg,xmlagg)


一、行轉列listagg函數:

場景:這里的表數據使用的是oracle默認的scott賬戶下的emp(員工)表。

規范寫法 : LISTAGG(字段, 連接符) WITHIN GROUP (ORDER BY 字段)  

通常情況下,LISTAGG是滿足需要的,LISTAGG 返回的是一個varchar2類型的數據,最大字節長度為4000。

所以,在實際開發中,我們可能會遇到一個問題,連接長度過長。在這個時候,我們需要將LISTAGG函數改成XMLAGG函數。XMLAGG返回的類型為CLOB,最大字節長度為32767。LISTAGG例子:

1、使用條件查詢部門號為20號的員工:

-- 查詢部門為20的員工列表
SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO = '20' ;

2、使用listagg() WITH 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

3、使用listagg() width group() over將多行記錄在一行顯示(不常用) 

SELECT
    T .DEPTNO,
    listagg (T .ENAME, ',') WITHIN GROUP (ORDER BY T .ENAME)  over(PARTITION BY T .DEPTNO)
FROM
    SCOTT.EMP T
WHERE
    T .DEPTNO = '20'

 

二、XMLAGG函數的例子:

XMLAGG(XMLPARSE(CONTENT BSO.ID || ',' WELLFORMED) ORDER BY BSO.ID).GETCLOBVAL()

規划寫法: XMLAGG(XMLPARSE(CONTENT 字段 || 字符串 WELLFORMED) ORDER BY 字段).GETCLOBVAL()

三、對於mysql相同的效果實現,可以使用group_concat() 函數,詳情可參考:

mysql相同效果的實現  https://blog.csdn.net/sinat_36257389/article/details/95052001

PostgreSQL 相同效果的實現 https://blog.csdn.net/sinat_36257389/article/details/95611686

轉自:https://blog.csdn.net/sinat_36257389/article/details/81004843,轉載請注明來源。

listagg


SELECTT .DEPTNO,listagg (T .ENAME, ',') WITHIN GROUP (ORDER BY T .ENAME)  over(PARTITION BY T .DEPTNO)FROMSCOTT.EMP TWHERET .DEPTNO = '20'————————————————版權聲明:本文為CSDN博主「_Covet」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/sinat_36257389/article/details/81004843


免責聲明!

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



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