数据库中分组字符串相加

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

–现在想把数据库中数据按照固定字段分组相加,这里总结了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头定义必须包含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. (   
  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使用中的点滴回忆

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/229465.html<

(0)
运维的头像运维
上一篇2025-04-18 18:58
下一篇 2025-04-18 18:59

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注