oracle中多列轉行

stotf發表於2019-09-12

方式一 通過wm_concat函式,該函式在10g可以使用,11g 中不相容,12g中去掉了該函式, ,返回型別為varchar

             語法:wm_concat(列)

             例子:Select wm_concat(Rownum) From dual Connect By Rownum < 10;

             優點:語法簡單

             缺點:字元長度不能超過4000,以逗號分隔,如果要以其他符號分割,還要替換,效能比較差


方式二:通過lisagg 返回型別為varchar             

             語法: listagg(引數,‘分隔符’) within group(order by 引數id)

             例子:Select 

                           listagg(Rownum,';') Within group(Order By Rownum Desc) 

                        From  dual   Connect By Rownum < 10;

             優點:可以排序,並且可以自定義分隔符,效率也高

             缺點:拼接字元長度不能超過4000


方式三:通過xmlagg,是解析MXL用的,也可以用作字元拼接,返回clob型別

             語法:
                      XMLAGG(XMLPARSE(CONTENT 欄位 || 分隔符 WELLFORMED) ORDER BY 欄位).GETCLOBVAL() 

                      或

                      XMLAGG(XMLELEMENT(e, 字串 , 分隔符).Extract('//text()')).GETCLOBVAL()      
             例子:

                     可以使用下面兩種之一:

                     Select Xmlagg(Xmlparse(Content Rownum || ',' Wellformed) Order By Rownum Desc)

                            .Getclobval()

                       From Dual

                     Connect By Rownum < 30000;      

                     Select Xmlagg(Xmlelement(e, Rownum, ',').Extract('//text()')).Getclobval()

                       From Dual

                     Connect By Rownum < 30;

             優點:對字元拼接沒有長度限制

             缺點:語法比較複雜



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557103/viewspace-2656949/,如需轉載,請註明出處,否則將追究法律責任。

相關文章