1.前言
Oracle可用連接函數會介紹以下幾個
- Oracle列轉行函數 Listagg()
- strcat()
- wmsys.wm_concat()
2.Oracle列轉行函數 Listagg()
2.1最基礎的用法:
LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX)
用法就像聚合函數一樣,通過Group by語句,把每個Group的一個字段,拼接起來。
其中LISTAGG函數第一個參數為要拼接的字段,第二個參數為用什么字符串進行連接
eg : listagg(city,’,’)
后面GROUP()中為對連接之后的行數據按什么字段進行排序
eg : order by city
with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nation ,'Shanghai' city from dual union all select 'China' nation ,'Beijing' city from dual union all select 'USA' nation ,'New York' city from dual union all select 'USA' nation ,'Bostom' city from dual union all select 'Japan' nation ,'Tokyo' city from dual ) select nation,listagg(city,',') within GROUP (order by city) as Cities from temp group by nation
運行結果:
2.2同樣是聚合函數,還有一個高級用法:
就是over(partition by XXX)
也就是說,在你不實用Group by語句時候,也可以使用LISTAGG函數:
with temp as( select 500 population, 'China' nation ,'Guangzhou' city from dual union all select 1500 population, 'China' nation ,'Shanghai' city from dual union all select 500 population, 'China' nation ,'Beijing' city from dual union all select 1000 population, 'USA' nation ,'New York' city from dual union all select 500 population, 'USA' nation ,'Bostom' city from dual union all select 500 population, 'Japan' nation ,'Tokyo' city from dual ) select population, nation, city, listagg(city,',') within GROUP (order by city) over (partition by nation) rank from temp
運行結果:
2.3總結
listagg()函數支持最低版本需要Oracle 11gR2,查詢自己Oracle版本sql如下,
SELECT v.VERSION FROM v$instance v;
如果版本低於11g,查詢會報錯 [未找到要求的 FROM 關鍵字]
3.strcat()
with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nation ,'Shanghai' city from dual union all select 'China' nation ,'Beijing' city from dual union all select 'USA' nation ,'New York' city from dual union all select 'USA' nation ,'Bostom' city from dual union all select 'Japan' nation ,'Tokyo' city from dual ) select nation,strcat(city) from temp group by nation
結果為:
注意:如果執行報錯,報錯內容為 strcat標識符無效,則你的版本缺少這個函數,手動執行下面的strcat源碼即可
ORACLE 字符串聚合函數 strCat
create or replace type strcat_type as object ( currentstr varchar2(4000), currentseprator varchar2(8), static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number, member function ODCIAggregateIterate(self IN OUT strcat_type,value IN VARCHAR2) return number, member function ODCIAggregateTerminate(self IN strcat_type,returnValue OUT VARCHAR2, flags IN number) return number, member function ODCIAggregateMerge(self IN OUT strcat_type,ctx2 IN strcat_type) return number ); create or replace type body strcat_type is static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number is begin sctx := strcat_type('',','); return ODCIConst.Success; end; member function ODCIAggregateIterate(self IN OUT strcat_type, value IN VARCHAR2) return number is begin if self.currentstr is null then self.currentstr := value; else self.currentstr := self.currentstr ||currentseprator || value; end if; return ODCIConst.Success; end; member function ODCIAggregateTerminate(self IN strcat_type, returnValue OUT VARCHAR2, flags IN number) return number is begin returnValue := self.currentstr; return ODCIConst.Success; end; member function ODCIAggregateMerge(self IN OUT strcat_type, ctx2 IN strcat_type) return number is begin if ctx2.currentstr is null then self.currentstr := self.currentstr; elsif self.currentstr is null then self.currentstr := ctx2.currentstr; else self.currentstr := self.currentstr || currentseprator || ctx2.currentstr; end if; return ODCIConst.Success; end; end; CREATE OR REPLACE FUNCTION strcat (input VARCHAR2) RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE USING strcat_type;
4.wmsys.wm_concat()
注意:11gr2和12C上已經摒棄了wm_concat函數,所以要用連接函數,建議使用之前介紹的兩種.如果之前老項目使用了這個函數,需要重建該函數或者在當前運行oracle版本中沒有這個函數請看這 “WM_CONCAT”: 標識符無效
with temp as( select 1 grp, 'a1' str from dual union select 1 grp, 'a2' str from dual union select 2 grp, 'b1' str from dual union select 2 grp, 'b2' str from dual union select 2 grp, 'b3' str from dual ) select grp, wmsys.wm_concat(str) from temp group by grp