oracle中list_oracle listagg 拼接字符串过长

oracle中list_oracle listagg 拼接字符串过长语法有点难以看懂,个人理解listagg是listaggregate的缩写(错了勿喷),也就是列表总计,聚合的意思。官方文档解释为:LISTAGGordersdatawithineachgroupspecifiedintheORDERBYclauseandthenconcatenatesthevaluesofthemeasurecolumn….

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

语法

在这里插入图片描述
有点难以看懂,个人理解listagg是list aggregate的缩写(错了勿喷),也就是列表总计,聚合的意思。
官方文档解释为:

LISTAGG orders data within each group specified in the ORDER BY clause and then concatenates the values of the measure column.

大概意思就是listagg函数先在每个组里用order by子句排序之后,再拼接每个分组里特指的列值。
从上面的解释可以知道,listagg每个组进行操作并返回一个输出行。

注意:这里的组在没有group by子句的时候指的是整个结果集,partition by子句指的是结果集中分区。

参数解释

上图的参数有:

  • ALL:ALL关键字是可选的。
  • measure_expr :measure_expr是被操作的列,可以是任何表达式。被操作的列中的空值将被忽略。
  • delimiter:分隔符,用来分割被操作列的列值,就是拼接每个列值后面跟一个分隔符,最后一个列值除外,分隔符也是可选的,默认值为NULL。
  • listagg_overflow_clause:这个子句控制当返回值超过返回数据类型的最大长度时函数的行为。也是可选的。
  • order_by_clause:顾名思义,排序子句。决定被连接值的顺序,谁在前谁在后。
  • query_partition_clause:listagg根据query_partition_clause中的一个或多个表达式将查询结果集划分为多个区(partition)。即分区之后,再进行列值拼接,注意partition的字段没有进行去重,仅仅是分区后进行处理,不会改变行数。Parttion by 关键字是Oracle中分析函数的一部分,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的结果。

实例

聚合函数

SELECT LISTAGG(last_name, '; ')
         WITHIN GROUP (ORDER BY hire_date, last_name) "Emp_list",
       MIN(hire_date) "Earliest"
  FROM employees
  WHERE department_id = 30;

Emp_list                                                     Earliest
------------------------------------------------------------ ---------
Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares            07-DEC-02
SELECT department_id "Dept.",
       LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date) "Employees"
  FROM employees
  GROUP BY department_id
  ORDER BY department_id;

Dept. Employees
------ ------------------------------------------------------------
    10 Whalen
    20 Hartstein; Fay
    30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares
    40 Mavris
    50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davie
       s; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot
       ; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; Matos; Pat
       el; Walsh; Feeney; Dellinger; McCain; Vargas; Gates; Rogers;
        Mikkilineni; Landry; Cabrio; Jones; Olson; OConnell; Sulliv
       an; Mourgos; Gee; Perkins; Grant; Geoni; Philtanker; Markle
    60 Austin; Hunold; Pataballa; Lorentz; Ernst
    70 Baer
. . .
SELECT department_id "Dept.",
       LISTAGG(last_name, '; ' ON OVERFLOW TRUNCATE '...')
               WITHIN GROUP (ORDER BY hire_date) "Employees"
  FROM employees
  GROUP BY department_id
  ORDER BY department_id;

Dept. Employees
------ ------------------------------------------------------------
    10 Whalen
    20 Hartstein; Fay
    30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares
    40 Mavris
    50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davie
       s; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot
       ; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; ... (23)
    70 Baer
. . .

分析函数

SELECT department_id "Dept", hire_date "Date", last_name "Name",
       LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name)
         OVER (PARTITION BY department_id) as "Emp_list"
  FROM employees
  WHERE hire_date < '01-SEP-2003'
  ORDER BY "Dept", "Date", "Name";

 Dept Date      Name            Emp_list
----- --------- --------------- ---------------------------------------------
   30 07-DEC-02 Raphaely        Raphaely; Khoo
   30 18-MAY-03 Khoo            Raphaely; Khoo
   40 07-JUN-02 Mavris          Mavris
   50 01-MAY-03 Kaufling        Kaufling; Ladwig
   50 14-JUL-03 Ladwig          Kaufling; Ladwig
   70 07-JUN-02 Baer            Baer
   90 13-JAN-01 De Haan         De Haan; King
   90 17-JUN-03 King            De Haan; King
  100 16-AUG-02 Faviet          Faviet; Greenberg
  100 17-AUG-02 Greenberg       Faviet; Greenberg
  110 07-JUN-02 Gietz           Gietz; Higgins
  110 07-JUN-02 Higgins         Gietz; Higgins

先进行”Dept”, “Date”, “Name”分组得到分组结果,再对结果集进行”department_id”分区,最后整合列值。

参考官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/LISTAGG.html#GUID-B6E50D8E-F467-425B-9436-F7F8BF38D466

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196521.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • node配置淘宝镜像_node配置淘宝镜像

    node配置淘宝镜像_node配置淘宝镜像node安装推荐去官网下载最新版本的,官网地址:https://nodejs.org/en/download/依照系统版本下载即可,推荐window系统下载msi格式的。下载下载直接安装下一步下一步。安装成功了以后打开cmdnode-v来检测是否安装成功cnpm安装由于我们被墙的厉害,所以使用npm下载模块时候会发现效率真的很慢,所以推荐淘宝的镜像,安装说明推荐:$npmins

    2022年8月31日
    0
  • vue中使用Ueditor编辑器

    vue中使用Ueditor编辑器

    2021年10月11日
    63
  • 医疗大数据平台的主流解决方案和设计

    医疗大数据平台的主流解决方案和设计  从价值服务提供的角度来看,这是一个需要对来自多源异构(时间序列)数据进行高效处理提供各种公共能力的资源池,也是促使用户/患者与医护人员及机构进行服务提供和安全可靠交互的控制中心。其主要特征包括平台的开放性、模块化、灵活性和可扩展性等,它肩负着多重重要的角色:一是需要支持多种可穿戴设备和数据类型的标准化接入,并具备大规模接入并发处理能力;必须尽量采用国内外标准化组织及行业通用的标准化协议和规…

    2022年5月8日
    49
  • 与运算(&)、或运算(|)、异或运算(^)、进制转换

    与运算(&)、或运算(|)、异或运算(^)、进制转换参加运算的两个对象,按二进制位进行运算。进制转换地址:http://tool.oschina.net/hexconvert/一:与运算符(&)预算规则:0&0=0;0&1=0;1&0=0;1&1=1即:两个同时为1,结果为1,否则为0例如:3&5十进制3转为二进制的3:00000011十进制5转为二进制的5:0000…

    2022年5月29日
    36
  • java基础知识之FileInputStream流

    java基础知识之FileInputStream流一、File流概念      JAVA中针对文件的读写操作设置了一系列的流,其中主要有FileInputStream,FileOutputStream,FileReader,FileWriter四种最为常用的流二、FileInputStream1)FileInputStream概念              FileInputStream流被称为文件字节输入流,意思指对文件数据…

    2022年4月30日
    45
  • java线程池浅析

    java线程池浅析简介    线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。线程池线程池的作用: …

    2022年7月7日
    21

发表回复

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

关注全栈程序员社区公众号