oracle listagg方法,Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg...
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...相关推荐
- python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析
本文实例讲述了Python字符串拼接.截取及替换方法.分享给大家供大家参考,具体如下: python字符串连接 python字符串连接有几种方法,我开始用的第一个方法效率是最低的,后来看了书以后就用了 ...
- python拼接字符串的方法,Python2中文字符串拼接
python 文本字符串接 python中有很多字符串连接方式,今天在写代码,顺便总结一下:最原始的字符串连接方式:str1 + str2python 新字符串连接语法:str1, str2奇怪的字符 ...
- js mysql query_node.js的mysql模块query方法里的字符串拼接问题
我写了一个和mysql交互的Node.js.大致功能是,在浏览器端提交用户信息表单后,会在现有的表userInfo里插入一条用户记录:然后针对这条用户记录自动再生成一个表,该表的名称是根据这条记录的i ...
- endnote x9使用方法_一文掌握 Endnote 核心功能使用方法
使用文献管理软件去整理文献和在写作科研论文时引用参考文献,是科研工作者的必备技能.Endnote 则是最常用的文献管理软件之一. Endnote 的功能十分强大,其中有很多高级功能也需要我们掌握.但是 ...
- php 即时聊天 实现方法,谈谈利用workerman实现即时聊天功能的方法
本篇文章给大家介绍一下使用workerman实现即时聊天的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 开发文档:http://doc2.workerman.net/ 下载服 ...
- [改善Java代码]自由选择字符串拼接方法
对一个字符串拼接有三种方法:加号,contact方法,StringBuffer或者StringBuilder的append方法,其中加号是最常用的.其他两种方式偶尔会出现在一些开源项目中,那么这三者有 ...
- Go语言中的字符串拼接方法介绍
本文介绍Go语言中的string类型.strings包和bytes.Buffer类型,介绍几种字符串拼接方法. 目录 string类型 strings包 strings.Builder类型 strin ...
- java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner
在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其中还有一个重要的拼接方式我没有介绍,那就是Java 8中 ...
- c++ 字符串拼接_字符串拼接新姿势:StringJoiner
来自:Hollis(微信号:hollischuang) 在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其 ...
最新文章
- {} 与 function() { } , 选用空对象{}来存放keyValue
- Python中的注释(转)
- CentOS7下的离线yum源搭建
- 图论数学:矩阵树定理
- Type对象获得泛型类型的两个扩展方法
- ps背景不变换字_PS教程:复杂背景中,如何利用通道轻松抠出发丝?
- java非必填字段跳过校验,avalon2表单验证,非必填字段在不填写的时候不能通过验证...
- CentOS7与Windows AD集成之二Windows域账户登录CentOS7
- Apache Common-cli简单使用
- 【亲测有效】win10下输入法突然变成繁体了怎么设置回来?
- kernel32.dll动态链接库报错解决方法win7,怎么修复kernel32.dll文件缺失
- 新概念下兴起域名商机 云域名是神马浮云
- startActivityForResult用法
- python搬家具_python面向对象编程: 搬家具案例
- 除了VR 还有什么能在2016年撬动物联网?
- 裁员潮,带给我的思考
- 一张照片生成3D头像!苹果新模型击败StyleGAN2,表情光线都能调,网友:要用于MR?...
- 用Python爬取需要登录的网站
- CH340驱动(含各平台)
- chromedriver selenium谷歌浏览器驱动
热门文章
- MFC Attach()函数和Detach()函数
- 第十一章项目沟通管理重点--转载
- VS.NET调试问题
- Avalonia跨平台入门第二十篇之语音播放问题
- C# 异步方法的异常处理
- .NET 6新特性试用 | DateOnly和TimeOnly类型
- .NET Core TLS 协议指定被我钻了空子~~~
- Visual Studio 2022 Preview 3和2019 16.11发布
- Happy 牛 Year!牛年dotnet云原生技术趋势
- api-hook,更轻量的接口测试工具