Oracle聚合函数LISTAGG和WM_CONCAT简介
创始人
2024-11-14 15:04:51
0次

目录

  • Oracle聚合函数LISTAGG和WM_CONCAT简介
    • LISTAGG 函数
      • 1.语法
      • 2.示例
      • 3.去除重复值
    • WM_CONCAT 函数
      • 1.语法
      • 2.示例
      • 3.去除重复值
    • 比较
      • 1.性能
      • 2.排序与分隔符
      • 3.去除重复值

Oracle聚合函数LISTAGG和WM_CONCAT简介

在处理数据库中的数据聚合任务时,我们经常需要将多行数据合并成一行字符串或列表。Oracle 提供了两种函数来实现这一目标:LISTAGG 和 WM_CONCAT。这两种函数各有特点,适用于不同的场景。

LISTAGG 函数

LISTAGG 是一个聚合函数,用于将一组值连接成一个字符串。它支持指定分隔符,并且可以设置最大长度以避免结果超出限制。

1.语法

LISTAGG(column, separator) WITHIN GROUP (ORDER BY column) 
  • column: 要连接的列名。
  • separator: 用作连接值之间的分隔符。
  • WITHIN GROUP (ORDER BY column): 可选子句,用于指定连接结果的顺序。

2.示例

假设我们有一个表 orders,其中包含以下数据:

order_idproduct
1Apples
1Bananas
2Oranges
2Apples
2Oranges

创建表 orders

CREATE TABLE orders (   order_id NUMBER(5) NOT NULL,   product VARCHAR2(20) NOT NULL ); 

插入数据

INSERT INTO orders (order_id, product) VALUES (1, 'Apples');  INSERT INTO orders (order_id, product) VALUES (1, 'Bananas');  INSERT INTO orders (order_id, product) VALUES (2, 'Oranges');  INSERT INTO orders (order_id, product) VALUES (2, 'Apples');  INSERT INTO orders (order_id, product) VALUES (2, 'Oranges'); 

使用上面的 orders 表,我们可以使用 LISTAGG 函数来获取每个订单的所有产品:

SELECT order_id,        LISTAGG(product, ', ') WITHIN GROUP (ORDER BY product) AS products FROM orders GROUP BY order_id; 

输出:

order_idproducts
1Apples, Bananas
2Apples, Oranges, Oranges

3.去除重复值

由于 LISTAGG 不支持 DISTINCT,我们可以通过子查询或者窗口函数来达到去除重复值的目的:

SELECT order_id,        LISTAGG(product, ', ') WITHIN GROUP (ORDER BY product) AS products FROM (   SELECT order_id, product   FROM (     SELECT order_id, product,            ROW_NUMBER() OVER (PARTITION BY order_id, product ORDER BY (NULL)) AS rn     FROM orders   )   WHERE rn = 1 ) GROUP BY order_id; 

输出:

order_idproducts
1Apples, Bananas
2Apples, Oranges

WM_CONCAT 函数

WM_CONCAT 是另一个连接函数,它将多个值连接成一个字符串。这个函数主要用于连接少量的数据,因为它没有内置的排序功能,并且可能会遇到性能问题。

1.语法

WM_CONCAT(column) 
  • column: 要连接的列名。

2.示例

使用上面的 orders 表,我们可以使用 WM_CONCAT 函数来获取每个订单的所有产品:

SELECT order_id,        WM_CONCAT(product) AS products FROM orders GROUP BY order_id; 

输出:

order_idproducts
1Apples, Bananas
2Oranges,Oranges,Apples

备注:使用 WM_CONCAT 函数没有内置的排序功能,结果可能无顺序。

3.去除重复值

在 WM_CONCAT 中去除重复值的方式非常直观,可以直接使用 DISTINCT 关键字:

SELECT order_id,        WM_CONCAT(DISTINCT product) AS products FROM orders GROUP BY order_id; 

输出:

order_idproducts
1Apples, Bananas
2Apples ,Oranges

比较

1.性能

  • LISTAGG: 性能较好,尤其是在处理大量数据时。
  • WM_CONCAT: 在处理大量数据时性能较差。

2.排序与分隔符

  • LISTAGG: 支持排序和自定义分隔符。
  • WM_CONCAT: 不支持排序,使用逗号作为默认分隔符。

3.去除重复值

  • LISTAGG: 需要通过子查询或窗口函数去除重复值。
  • WM_CONCAT: 可以直接使用 DISTINCT 关键字去除重复值。

LISTAGG 和 WM_CONCAT 都可以用来连接多个值,但 LISTAGG 更加灵活并且性能更优。对于大多数情况来说,推荐使用 LISTAGG 函数,特别是在需要对结果进行排序或需要自定义分隔符的情况下。在仅需要去除重复值时 WM_CONCAT 可能更方便,WM_CONCAT 可以直接使用 DISTINCT 关键字,而 LISTAGG 则需要通过子查询或窗口函数的方法来实现。

相关内容

热门资讯

每日必看!江岸多玩到底能开挂吗... 每日必看!江岸多玩到底能开挂吗(辅助挂),江岸多玩原来真的有辅助挂讲义1、江岸多玩脚本辅助下载、江岸...
玩家交流!颖河竞技怎么开挂(外... 玩家交流!颖河竞技怎么开挂(外挂),颖河竞技好像是有外挂教材一、颖河竞技游戏安装教程牌型概率发牌机制...
最新通报!皮皮四川麻将软件下载... 最新通报!皮皮四川麻将软件下载(辅助挂),皮皮四川麻将果然有辅助挂模块1、操作简单,无需皮皮四川麻将...
一分钟揭秘!52游戏开挂脚本(... 一分钟揭秘!52游戏开挂脚本(透视挂),52游戏切实有透视挂法子52游戏脚本下载中分为三种模型:52...
一分钟快速了解!堆堆乐开挂破解... 一分钟快速了解!堆堆乐开挂破解(外挂),堆堆乐竟然真的有外挂方针1、下载好堆堆乐正确养号方法之后点击...
重大通报!汇城贵州麻将开挂脚本... 重大通报!汇城贵州麻将开挂脚本(开挂),汇城贵州麻将原来真的有开挂法门1、重大通报!汇城贵州麻将开挂...
盘点一款!七色城透视挂件(外挂... 盘点一款!七色城透视挂件(外挂),七色城切实是真的有外挂经验1、全新机制【七色城ai辅助工具激活码】...
今日头条!多多休闲透视软件下载... 今日头条!多多休闲透视软件下载(外挂),多多休闲确实是真的有外挂攻略1、首先打开多多休闲辅助器下载最...
关于!钱柜麻将真的有透视吗(辅... 关于!钱柜麻将真的有透视吗(辅助器),钱柜麻将一贯是有辅助器练习钱柜麻将能透视中分为三种模型:钱柜麻...
今日焦点!河北家乡棋牌辅助工具... 今日焦点!河北家乡棋牌辅助工具(外挂),河北家乡棋牌果然是有外挂手册小薇(辅助器软件下载)致您一封信...