Oracle多行記錄合并的幾種方法

來源:互聯網
上載者:User

標籤:

今天正好遇到需要做這個功能,順手搜了一下網路,把幾種方法都列出來,方便以後參考。

1 什麼是合并多行字串(連接字串)呢,例如:

SQL> desc test;
Name Type Nullable Default Comments
------- ------------ -------- ------- --------
COUNTRY VARCHAR2(20) Y
CITY VARCHAR2(20) Y
SQL> select * from test;
COUNTRY CITY
-------------------- --------------------
中國 台北
中國 香港
中國 上海
日本 東京
日本 大阪
要求得到如下結果集:
------- --------------------
中國 台北,香港,上海
日本 東京,大阪

其實網友已經有一個匯總的解決方案了,如下

Oracle 多行記錄合并/串連/彙總字串的幾種方法

2 通過自訂函數的方法

這個方法比較靈活,隨時可調用該函數,推薦使用,由於原網頁代碼有誤,我這裡再貼一遍

--?CREATE OR REPLACE FUNCTION strcat (input VARCHAR2) RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE USING strcat_type; --?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;
View Code

 

Oracle多行記錄合并自訂函數STRCAT

3 行轉列函數,wmsys.wm_concat()、LISTAGG()等

a WMSYS下的東西,一般功能不應該使用,

但我們也可以試試,如果查詢出的值提示為CLOB的話,不要驚慌,前面再加一個to_char()就好了,具體參考

oracle合并列的函數wm_concat的使用詳解

b 行轉列函數listagg()還是不錯的

下面這個例子,作者自己構造了一個表進行轉換,合并行,當然也可以合并值,但不合并行,具體參考

Oracle 列轉行函數 Listagg()

用系統內建的表進行示範下

------語句1select cc.mgr,listagg(cc.ename,‘,‘) within GROUP (order by cc.mgr) from scott.emp cc group by cc.mgr------語句2 請注意這兩句查詢結果的不同select cc.mgr,listagg(cc.ename,‘,‘) within GROUP(order by cc.mgr) over (partition by cc.mgr) rank from scott.emp cc

結果如下

結果1

1    7566    FORD,SCOTT
2    7698    ALLEN,JAMES,MARTIN,TURNER,WARD
3    7782    MILLER
4    7788    ADAMS
5    7839    BLAKE,CLARK,JONES
6    7902    SMITH
7        KING

結果2

1    7566    FORD,SCOTT
2    7566    FORD,SCOTT
3    7698    JAMES,ALLEN,WARD,TURNER,MARTIN
4    7698    JAMES,ALLEN,WARD,TURNER,MARTIN
5    7698    JAMES,ALLEN,WARD,TURNER,MARTIN
6    7698    JAMES,ALLEN,WARD,TURNER,MARTIN
7    7698    JAMES,ALLEN,WARD,TURNER,MARTIN
8    7782    MILLER
9    7788    ADAMS
10    7839    BLAKE,JONES,CLARK
11    7839    BLAKE,JONES,CLARK
12    7839    BLAKE,JONES,CLARK
13    7902    SMITH
14        KING

網路資源,原作者可要求刪除,謝謝

Oracle多行記錄合并的幾種方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.