Oracle各種連接函數總結


1.前言

Oracle可用連接函數會介紹以下幾個

  1. Oracle列轉行函數 Listagg()
  2. strcat()
  3. 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


免責聲明!

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



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