Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg

字符串拼接(String Aggregation Techniques)是数据处理时经常需要用到一个技术,比如需要按时间顺序拼装一个快递的运输记录,或者将流程中各个环节的处理人拼装为一个字符串。

Oracle中有多种方法来实现这个功能,这里罗列几种,详细用法可以参考下面的文章:

WM_CONCAT函数

LISTAGG函数

自定义聚合函数

本文介绍第二种:LISTAGG函数,这是Oracle11gR2开始正式推出的字符串聚合函数,功能非常强大。

0.测试样例及基本用法

从all_objects视图中取4个表记录和3个视图记录作为测试数据:

SQL> CREATE TABLE T_STRAGG AS

2 select OBJECT_TYPE,CREATED,OBJECT_NAME from ALL_OBJECTS WHERE OBJECT_TYPE='TABLE' AND rownum<5

3 UNION ALL

4 select OBJECT_TYPE,CREATED,OBJECT_NAME from ALL_OBJECTS WHERE OBJECT_TYPE='VIEW' AND rownum<4;

Table created

SQL> select OBJECT_TYPE,TO_CHAR(CREATED,'YYYY-MM-DD HH24:MI:SS') CREATED,OBJECT_NAME from T_STRAGG;

OBJECT_TYPE CREATED OBJECT_NAME

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

TABLE 2013-10-09 18:23:43 DUAL

TABLE 2013-10-09 18:23:44 SYSTEM_PRIVILEGE_MAP

TABLE 2013-10-09 18:23:45 TABLE_PRIVILEGE_MAP

TABLE 2013-10-09 18:23:47 STMT_AUDIT_OPTION_MAP

VIEW 2013-10-09 18:23:53 ALL_XML_SCHEMAS

VIEW 2013-10-09 18:23:56 ALL_XML_SCHEMAS2

VIEW 2013-10-09 18:23:54 V_$ADVISOR_CURRENT_SQLPLAN

现在想要根据OBJECT_TYPE分组,将OBJECT_NAME按时间顺序拼装成类似物流信息的字符串:

2013-10-09 18:23:43@DUAL

2013-10-09 18:23:44@SYSTEM_PRIVILEGE_MAP

2013-10-09 18:23:45@TABLE_PRIVILEGE_MAP

实现方法很简单:

SQL> select object_type

2 ,LISTAGG(TO_CHAR(CREATED,'YYYY-MM-DD HH24:MI:SS')||'@'||OBJECT_NAME,CHR(10)) WITHIN GROUP(ORDER BY CREATED) AS TXT

3 FROM T_STRAGG

4 GROUP BY object_type;

OBJECT_TYPE TXT

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

TABLE 2013-10-09 18:23:43@DUAL

2013-10-09 18:23:44@SYSTEM_PRIVILEGE_MAP

2013-10-09 18:23:45@TABLE_PRIVILEGE_MAP

2013-10-09 18:23:47@STMT_AUDIT_OPTION_MAP

VIEW 2013-10-09 18:23:53@ALL_XML_SCHEMAS

2013-10-09 18:23:54@V_$ADVISOR_CURRENT_SQLPLAN

2013-10-09 18:23:56@ALL_XML_SCHEMAS2

跟WM_CONCAT相比,LISTAGG有如下特征(优缺点):

1.返回值的分隔符可以自定义

这一点大大方便了开发人员,只要有需要可以摆出各种姿势^_^

2.返回值类型是VARCHAR2

跟WM_CONCAT相反,速度是快了,但如果数据量大就报错

ORA-01489: result of string concatenation is too long

(字符串连接的结果过长)

SQL> INSERT INTO T_STRAGG select object_type,CREATED,OBJECT_NAME FROM ALL_OBJECTS where rownum<1000;

999 rows inserted

SQL> select object_type

2 ,LISTAGG(TO_CHAR(CREATED,'YYYY-MM-DD HH24:MI:SS')||'@'||OBJECT_NAME,CHR(10)) WITHIN GROUP(ORDER BY CREATED) AS TXT

3 FROM T_STRAGG

4 GROUP BY object_type;

ORA-01489: result of string concatenation is too long

没办法,用回WM_CONCAT?

还是建议用第三个方法:自定义聚合函数

3.不支持DISTINCT

直接报错ORA-30482: DISTINCT option not allowed for this function

(DISTINCT 选项在此函数中禁用)

SQL> select object_type,LISTAGG(DISTINCT OBJECT_NAME) WITHIN GROUP(ORDER BY CREATED) AS TXT

2 FROM T_STRAGG

3 GROUP BY object_type;

ORA-30482: DISTINCT option not allowed for this function

解决方法:

1.先distinct,结果再listagg

2.自定义聚合函数来取代listagg函数

结论

listagg能满足的情况下,用listagg,不要用wm_concat listagg无法满足的情况下,还是网上拿一个自定义聚合函数好了

http://www.dengb.com/oracle/1315268.htmlwww.dengb.comtruehttp://www.dengb.com/oracle/1315268.htmlTechArticleOracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg 字符串拼接(String Aggregation Techniques)是数据处理时经常需要用到一个技...

oracle listagg方法,Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg...相关推荐

  1. python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析

    本文实例讲述了Python字符串拼接.截取及替换方法.分享给大家供大家参考,具体如下: python字符串连接 python字符串连接有几种方法,我开始用的第一个方法效率是最低的,后来看了书以后就用了 ...

  2. python拼接字符串的方法,Python2中文字符串拼接

    python 文本字符串接 python中有很多字符串连接方式,今天在写代码,顺便总结一下:最原始的字符串连接方式:str1 + str2python 新字符串连接语法:str1, str2奇怪的字符 ...

  3. js mysql query_node.js的mysql模块query方法里的字符串拼接问题

    我写了一个和mysql交互的Node.js.大致功能是,在浏览器端提交用户信息表单后,会在现有的表userInfo里插入一条用户记录:然后针对这条用户记录自动再生成一个表,该表的名称是根据这条记录的i ...

  4. endnote x9使用方法_一文掌握 Endnote 核心功能使用方法

    使用文献管理软件去整理文献和在写作科研论文时引用参考文献,是科研工作者的必备技能.Endnote 则是最常用的文献管理软件之一. Endnote 的功能十分强大,其中有很多高级功能也需要我们掌握.但是 ...

  5. php 即时聊天 实现方法,谈谈利用workerman实现即时聊天功能的方法

    本篇文章给大家介绍一下使用workerman实现即时聊天的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 开发文档:http://doc2.workerman.net/ 下载服 ...

  6. [改善Java代码]自由选择字符串拼接方法

    对一个字符串拼接有三种方法:加号,contact方法,StringBuffer或者StringBuilder的append方法,其中加号是最常用的.其他两种方式偶尔会出现在一些开源项目中,那么这三者有 ...

  7. Go语言中的字符串拼接方法介绍

    本文介绍Go语言中的string类型.strings包和bytes.Buffer类型,介绍几种字符串拼接方法. 目录 string类型 strings包 strings.Builder类型 strin ...

  8. java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

    在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其中还有一个重要的拼接方式我没有介绍,那就是Java 8中 ...

  9. c++ 字符串拼接_字符串拼接新姿势:StringJoiner

    来自:Hollis(微信号:hollischuang) 在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其 ...

最新文章

  1. {} 与 function() { } , 选用空对象{}来存放keyValue
  2. Python中的注释(转)
  3. CentOS7下的离线yum源搭建
  4. 图论数学:矩阵树定理
  5. Type对象获得泛型类型的两个扩展方法
  6. ps背景不变换字_PS教程:复杂背景中,如何利用通道轻松抠出发丝?
  7. java非必填字段跳过校验,avalon2表单验证,非必填字段在不填写的时候不能通过验证...
  8. CentOS7与Windows AD集成之二Windows域账户登录CentOS7
  9. Apache Common-cli简单使用
  10. 【亲测有效】win10下输入法突然变成繁体了怎么设置回来?
  11. kernel32.dll动态链接库报错解决方法win7,怎么修复kernel32.dll文件缺失
  12. 新概念下兴起域名商机 云域名是神马浮云
  13. startActivityForResult用法
  14. python搬家具_python面向对象编程: 搬家具案例
  15. 除了VR 还有什么能在2016年撬动物联网?
  16. 裁员潮,带给我的思考
  17. 一张照片生成3D头像!苹果新模型击败StyleGAN2,表情光线都能调,网友:要用于MR?...
  18. 用Python爬取需要登录的网站
  19. CH340驱动(含各平台)
  20. chromedriver selenium谷歌浏览器驱动

热门文章

  1. MFC Attach()函数和Detach()函数
  2. 第十一章项目沟通管理重点--转载
  3. VS.NET调试问题
  4. Avalonia跨平台入门第二十篇之语音播放问题
  5. C# 异步方法的异常处理
  6. .NET 6新特性试用 | DateOnly和TimeOnly类型
  7. .NET Core TLS 协议指定被我钻了空子~~~
  8. Visual Studio 2022 Preview 3和2019 16.11发布
  9. Happy 牛 Year!牛年dotnet云原生技术趋势
  10. api-hook,更轻量的接口测试工具