成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫中分組字符串相加

數據庫
如果想把數據庫中的數據按照固定字段分組想加,你會怎么做呢?筆者在這里總結了五種方法,也許有的你想到,也許有的你沒有想到,一起再來看看,相互學習吧。

--該測試腳本可以直接運行

--現在想把數據庫中數據按照固定字段分組相加,這里總結了5種方法。

--創建測試表、添加測試數據

  1. create table test(id varchar2(10),mc varchar2(50));   
  2. insert into test values('1','11111');   
  3. insert into test values('1','22222');   
  4. insert into test values('2','11111');   
  5. insert into test values('2','22222');   
  6. insert into test values('3','11111');   
  7. insert into test values('3','22222');   
  8. insert into test values('3','33333');   
  9. commit

--方法一:

  1. set serveroutput on size 1000000   
  2. declare   
  3. union_mc varchar2(200);   
  4. begin   
  5. for cur_a in(select distinct id from test) loop   
  6. for cur_b in(select mc from test where id=cur_a.id) loop   
  7. union_mc:=union_mc||cur_b.mc;   
  8. end loop;   
  9. dbms_output.put_line(cur_a.id||chr(9)||union_mc);   
  10. union_mc := '';   
  11. end loop;   
  12. end;   
  13. /  

--方法二:

  1. CREATE OR REPLACE function link(v_id varchar2)   
  2. return varchar2   
  3. is   
  4. union_mc varchar2(200);   
  5. begin   
  6. for cur in (select mc from test where id=v_id) loop   
  7. union_mc := union_mc||cur.mc;   
  8. end loop;   
  9. union_mc := rtrim(union_mc,1);   
  10. return union_mc;   
  11. end;   
  12. /   
  13.  
  14. select id,link(id) from test group by id; 

--方法三:

/*從Oracle 9i開始,開發者可以創建用戶自定義的合計函數,除了PL/SQL外,還可以使用任何Oralce所支持的語言(如C++或者Java)來創建合計函數。TYPE頭定義必須包含ODCIAggregateInitialize、ODCIAggregateIterate、ODCIAggregateMergeODCIAggregateTerminate這四個接口函數。*/

/*Initialize函數對數據組各個需要處理的字段各運行一次。自然的,我需要為每一個值準備一個新的清單,所以需要初始化持久變量list,這里初始化值為null。*/

/*Iterate函數處理返回的行,所以實際上是由它來創建返回的值的清單。先測試list是否為空,如果為空,就把list直接設置為所引入的value值;如果list變量非空,則給list添加一個逗號后再插入value值,list的最大允許字符數32767。*/

/*Terminate函數在數據組的每個行的感興趣字段數據被處理后執行。在這個函數中我只需簡單的返回清單變量即可。*/

/*Merge函數,用來返回成功標記的。*/

/*創建自己的合計函數擴展了Oracle統計和文本處理能力。*/

  1. create or replace type t_cat as object   
  2. (   
  3. union_mc VARCHAR2(200),   
  4. static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number,   
  5. member function ODCIAggregateIterate(self IN OUT t_cat,value IN varchar2) return number,   
  6. member function ODCIAggregateTerminate(self IN t_cat,returnValue OUT varchar2, flags IN number) return number,   
  7. member function ODCIAggregateMerge(self IN OUT t_cat,ctx2 IN t_cat) return number   
  8. );   
  9.  
  10. create or replace type body t_cat is   
  11. static function ODCIAggregateInitialize(sctx IN OUT t_cat )   
  12. return number is   
  13. begin   
  14. sctx := t_cat('');   
  15. return ODCIConst.Success;   
  16. end;   
  17. member function ODCIAggregateIterate(self IN OUT t_cat, value IN varchar2)   
  18. return number is   
  19. begin   
  20. self.union_mc := self.union_mc || value;   
  21. return ODCIConst.Success;   
  22. end;   
  23. member function ODCIAggregateTerminate(self IN t_cat, returnValue OUT varchar2, flags IN number) return number is   
  24. begin   
  25. returnValue := self.union_mc;   
  26. return ODCIConst.Success;   
  27. end;   
  28. member function ODCIAggregateMerge(self IN OUT t_cat , ctx2 IN t_cat ) return number is   
  29. begin   
  30. return ODCIConst.Success;   
  31. end;   
  32. end;   

/*如果你的Oracle服務器沒有配置成支持并行處理的方式,可以去掉參數PARALLEL_ENABLE*/

create or replace function catstr(v_mc varchar2) return varchar2 PARALLEL_ENABLE AGGREGATE USING t_cat;
/

select id,catstr(mc) from test group by id;

--方法四:

--oracle9i以上版本

  1. select id,ltrim(max(sys_connect_by_path(mc,';')),';'from(   
  2. select id,mc,row_number() over(partition by id order by id) id1,   
  3. row_number() over(order by id) + dense_rank() over(order by id) id2   
  4. from test   
  5. )   
  6. start with id1=1 connect by prior id2 = id2 -1   
  7. group by id order by id;  

方法四的另一種寫法

估計類似的寫法還有很多,這個和上一個不同在于用的沒有帶有start with(filter功能)的connect,并借助level和first_value來實現。

  1. SELECT distinct id,ltrim(first_value(mc_add) over (partition by id order BY l DESC),';')   
  2. from (   
  3. SELECT id,LEVEL l,sys_connect_by_path(mc,';') mc_add from   
  4. (   
  5. select id||rownum rn,id||rownum-1 rn_small,id,mc from test   
  6. )   
  7. CONNECT BY PRIOR rn = rn_small   
  8. )   

方法五:

  1. select id,wm_concat(mc) from test group by id 

原文鏈接:http://www.cnblogs.com/tracy/archive/2011/05/11/2042910.html

 

【編輯推薦】

  1. 淺述遠程Service Broker的實現
  2. Service Broker基礎應用(下)
  3. Service Broker基礎應用(上)
  4. 簡述Service Broker事件通知功能
  5. SQL使用中的點滴回憶
責任編輯:艾婧 來源: 博客園
相關推薦

2009-08-07 14:02:12

C#數據庫連接字符串

2009-08-20 17:55:43

C#連接Oracle數

2022-12-06 08:27:50

Bash腳本字符串

2010-11-26 09:46:26

MySQL字符串相加

2010-05-26 15:36:23

MySQL字符串

2010-06-04 14:59:06

MySQL數據庫

2011-07-12 14:37:47

ASP.NET鏈接字符串

2009-07-24 10:06:33

數據庫字符串ASP.NET

2010-09-13 15:50:03

sql server數

2011-03-22 10:44:20

SQL Server數拆分字符串函數

2010-06-13 18:06:06

2010-09-28 09:49:48

SQL字符串

2010-06-17 15:54:04

SQL Server數

2011-06-28 13:38:48

注冊表鍵值連接字符串

2010-06-17 16:06:07

SQL Server數

2011-08-09 16:52:24

2009-07-30 12:54:37

ASP.NET優化性能

2010-06-17 16:30:23

SQL Server數

2010-09-28 09:42:25

sql語句

2009-08-20 18:13:17

C#中Access數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色婷婷综合成人av | 国产免费色 | 四虎影院一区二区 | 国产目拍亚洲精品99久久精品 | 成年人精品视频在线观看 | 国产97在线 | 日韩 | 午夜视频在线播放 | 免费中文字幕 | 蜜桃精品在线 | 国产在线一区二区 | 99精品视频免费观看 | 精品综合 | 99精品视频在线观看 | 午夜视频网站 | 国产精品亚洲精品 | 国产精品永久免费视频 | 国产小视频精品 | 91精品麻豆日日躁夜夜躁 | 国产精品久久久久久 | 成人免费视屏 | 久久精品色欧美aⅴ一区二区 | 亚洲精品乱码久久久久久蜜桃 | 日韩精品久久久久久 | 日韩一区二区在线视频 | 黄色片视频免费 | 欧美日韩在线高清 | 国产日韩一区二区三区 | 91精品国产综合久久久久久丝袜 | 农村黄性色生活片 | 欧美激情精品久久久久久变态 | 免费亚洲一区二区 | 国产一级在线 | 污免费网站 | 亚洲精品大全 | 伊人网在线看 | 成年免费大片黄在线观看岛国 | 一区二区三区精品视频 | 日韩欧美在线免费观看视频 | 韩国av网站在线观看 | 中文字幕日韩欧美 | 免费毛片网站在线观看 |