1. 程式人生 > >oracle wm concat函式 用於列轉行 逗號分隔

oracle wm concat函式 用於列轉行 逗號分隔

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

wm_concat函式

 

首先讓我們來看看這個神奇的函式wm_concat(列名),該函式可以把列值以","號分隔起來,並顯示成一行,接下來上例子,看看這個神奇的函式如何應用

準備測試資料

 

SQL> create table test(id number,name varchar2(20));

SQL> insert into test values(1,'a');

SQL> insert into test values(1,'b');

SQL> insert into test values(1,'c');

SQL> insert into test values(2,'d');

SQL> insert into test values(2,'e');

 

SQL> commit;

 

效果1 : 行轉列

 

SQL> select wm_concat(name) from test;

WM_CONCAT(NAME)

-------------------------------------------------------------------------

a,b,c,d,e

 

效果2: 把結果裡的逗號替換成"|"

 

SQL> select replace(wm_concat(name),',','|') from test;

REPLACE(WM_CONCAT(NAME),',','|')

-----------------------------------------------------------------------

a|b|c|d|e

 

 

效果3:按ID分組合並name

 

SQL> select id,wm_concat(name) name from test group by id;

ID NAME

---------- ------------------------------

1 a,b,c

2 d,e

 

懶人擴充套件用法:

案例:我要寫一個檢視,類似"create or replace view as select 欄位1,...欄位50 from tablename" ,基表有50多個欄位,要是靠手工寫太麻煩了,有沒有什麼簡便的方法? 當然有了,看我如果應用wm_concat來讓這個需求變簡單

 

SQL> select 'create or replace view as select '|| wm_concat(column_name) || ' from dept'from user_tab_columns where table_name='DEPT';

'CREATEORREPLACEVIEWASSELECT'||WM_CONCAT(COLUMN_NAME)||'FROMDEPT'

--------------------------------------------------------------------------------

create or replace view as select DEPTNO,DNAME,LOC from dept



Oracle9i新增 wm_concat函式(轉)


一: 

建立type頭 

create or replace type string_sum_obj as object ( 
--聚合函式的實質就是一個物件 
     sum_string varchar2(4000), 
     static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number, 
     --物件初始化 
     member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number, 
     --聚合函式的迭代方法(這是最重要的方法) 
     member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number, 
     --當查詢語句並行執行時,才會使用該方法,可將多個並行執行的查詢結果聚合 
      
     member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number 
     --終止聚集函式的處理,返回聚集函式處理的結果. 



建立type具體 
create or replace type body string_sum_obj is 
     static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number is 
     begin 
         v_self := string_sum_obj(null); 
         return ODCICONST.Success; 
     end; 
     member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number is 
     begin 
          /* 連線,解決逗號分隔第一個字母是逗號的問題 */    
           if not self.sum_string is null then 
          self.sum_string := self.sum_string ||','|| value; 
          else 
          self.sum_string := self.sum_string || value; 
          end if; 
          return ODCICONST.Success; 
          /* 最大值 */ 
          if self.sum_string<value then 
              self.sum_string:=value; 
          end if; 
          /* 最小值 */ 
          if self.sum_string>value then 
       self.sum_string:=value;           
          end if; 
           
          return ODCICONST.Success; 
     end; 
     member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number is 
     begin 
          /* 連線 */    
          self.sum_string := self.sum_string || v_next.sum_string; 
          return ODCICONST.Success; 
          /* 最大值 */ 
          if self.sum_string<v_next.sum_string then 
              self.sum_string:=v_next.sum_string; 
          end if; 

          /* 最小值 */ 
          if self.sum_string>v_next.sum_string then 
              self.sum_string:=v_next.sum_string;           
          end if; 
           
          return ODCICONST.Success; 
     end; 
     member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number is 
     begin 
          return_value:= self.sum_string; 
          return ODCICONST.Success; 
     end; 
end; 


建立函式 
create or replace function wm_concat(value Varchar2) return Varchar2 
     parallel_enable aggregate using string_sum_obj; 

二: 

先建立這個型別 

create or replace type strcat_type as object ( 
    cat_string varchar2(4000), 
    static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number, 
    member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return number, 
    member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type) return number, 
    member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number) return number 


缺少型別體內容: 

.... 


然後建立這個函式 

CREATE OR REPLACE FUNCTION strcat(input varchar2 ) 
RETURN varchar2 
PARALLEL_ENABLE AGGREGATE USING strcat_type; 


幾個用法: 

9i: SYS_CONNECT_BY_PATH 函式 



SQL> select id, replace(wmsys.wm_concat(rmak), ',', '') from test group by id; 

        ID REPLACE(WMSYS.WM_CONCAT(RMAK), 
---------- -------------------------------------------------------------------------------- 
         9 timggg 
        21 littlefff 
        23 tom 



SQL> select * from idtable; 

        ID NAME 
---------- ------------------------------ 
        10 ab 
        10 bc 
        10 cd 
        20 hi 
        20 ij 
        20 mn 

6 rows selected 
SQL> select id,wmsys.wm_concat(name) name from idtable 
  2  group by id; 

        ID NAME 
---------- -------------------------------------------------------------------------------- 
        10 ab,bc,cd 
        20 hi,ij,mn 

SQL> select id,wmsys.wm_concat(name) over (order by id) name from idtable; 

        ID NAME 
---------- -------------------------------------------------------------------------------- 
        10 ab,bc,cd 
        10 ab,bc,cd 
        10 ab,bc,cd 
        20 ab,bc,cd,hi,ij,mn 
        20 ab,bc,cd,hi,ij,mn 
        20 ab,bc,cd,hi,ij,mn 

6 rows selected 

SQL> select id,wmsys.wm_concat(name) over (order by id,name) name from idtable; 

        ID NAME 
---------- -------------------------------------------------------------------------------- 
        10 ab 
        10 ab,bc 
        10 ab,bc,cd 
        20 ab,bc,cd,hi 
        20 ab,bc,cd,hi,ij 
        20 ab,bc,cd,hi,ij,mn 

6 rows selected 

個人覺得這個用法比較有趣. 

SQL> select id,wmsys.wm_concat(name) over (partition by id) name from idtable; 

        ID NAME 
---------- -------------------------------------------------------------------------------- 
        10 ab,bc,cd 
        10 ab,bc,cd 
        10 ab,bc,cd 
        20 hi,ij,mn 
        20 hi,ij,mn 
        20 hi,ij,mn 

6 rows selected 

SQL> select id,wmsys.wm_concat(name) over (partition by id,name) name from idtable; 

        ID NAME 
---------- -------------------------------------------------------------------------------- 
        10 ab 
        10 bc 
        10 cd 
        20 hi 
        20 ij 
        20 mn 

6 rows selected


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述