一、行轉列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