数据库中分组字符串相加

--该测试脚本可以直接运行

创新互联公司专注于企业全网整合营销推广、网站重做改版、都匀网站定制设计、自适应品牌网站建设、H5高端网站建设商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为都匀等各大城市提供网站开发制作服务。

--现在想把数据库中数据按照固定字段分组相加,这里总结了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; 

--方法二:

  
 
 
  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. select id,link(id) from test group by id;

--方法三:

/*从Oracle 9i开始,开发者可以创建用户自定义的合计函数,除了PL/SQL外,还可以使用任何Oralce所支持的语言(如C++或者Java)来创建合计函数。TYPE头定义必须包含ODCIAggregateInitializeODCIAggregateIterateODCIAggregateMergeODCIAggregateTerminate这四个接口函数。*/

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

/*如果你的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. start with id1=1 connect by prior id2 = id2 -1 
  6. 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. select id||rownum rn,id||rownum-1 rn_small,id,mc from test 
  5. CONNECT BY PRIOR rn = rn_small 
  6. ;

方法五:

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

网页题目:数据库中分组字符串相加
分享地址:http://www.36103.cn/qtweb/news20/11620.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联