oracle之listagg()函数

1.使用条件查询  查询部门为20的员工列表
-- 查询部门为20的员工列表

SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO = '20';

  效果:

2.使用  listagg() WITHIN GROUP ()  将多行合并成一行

SELECT T.DEPTNO, 
     LISTAGG (T.ENAME, ',') WITHIN GROUP (ORDER BY T.ENAME) AS NAMES
FROM SCOTT.EMP T
WHERE T.DEPTNO = '20'
GROUP BY T.DEPTNO;


    效果:

3. 使用 listagg() within GROUP () over  将多行记录在一行显示

SELECT
    T.DEPTNO,
    LISTAGG(T.ENAME,',') WITHIN GROUP (ORDER BY T.ENAME) OVER(PARTITION BY T.DEPTNO) as ENAME
FROM
  SCOTT.EMP T WHERE T.DEPTNO = '20';


    效果:

4、XMLAGG

  说明:xmlagg相比较listagg可以处理超过4000字符的字符串,返回的是clob类型数据。

语句一:结果中的聚合字段是CLOB类型,是文本字符。处理400多万条数据,运行时间是20分钟。

SELECT T.DEPTNO,LTRIM(XMLAGG(XMLELEMENT(T,',',T.ENAME)ORDER BY T.ENAME).EXTRACT('//text()').GETCLOBVAL(),',') AS NAMES 
  FROM SCOTT.EMP T 
 WHERE T.DEPTNO=20
GROUP BY T.DEPTNO;

如下:

语句二:结果汇总的聚合字段也是clob类型,不过是hex字节;处理400多万条数据,运行时间是56秒

SELECT T.DEPTNO,
       RTRIM(XMLAGG(XMLPARSE(CONTENT T.ENAME || ','WELLFORMED) ORDER BY T.ENAME).GETCLOBVAL(),',')  AS NAMES
  FROM SCOTT.EMP T 
 WHERE T.DEPTNO=20 
GROUP BY T.DEPTNO;

效果:

### Oracle LISTAGG 函数的用法及示例 Oracle 中的 `LISTAGG` 函数用于将多行数据合并为单个字符串,常用于字符串聚合操作。该函数支持指定分隔符,并可对结果进行排序[^1]。 #### 基本语法 ```sql LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY order_clause) ``` - `expression`:需要聚合的列或表达式。 - `delimiter`:指定用于分隔值的字符串。 - `WITHIN GROUP (ORDER BY order_clause)`:定义聚合值的排序方式。 #### 使用示例 以下示例展示如何将某列的多个值合并为逗号分隔的字符串: ```sql SELECT dept_id, LISTAGG(emp_name, ', ') WITHIN GROUP (ORDER BY emp_name) AS employees FROM employees GROUP BY dept_id; ``` 该查询将每个部门的员工姓名按字母顺序排列,并用逗号和空格连接成一个字符串[^1]。 #### 高级用法 在复杂查询中,`LISTAGG` 可与其他函数结合使用。例如,结合 `DISTINCT` 去重后再进行聚合: ```sql SELECT dept_id, LISTAGG(emp_name, ', ') WITHIN GROUP (ORDER BY emp_name) AS unique_employees FROM ( SELECT DISTINCT dept_id, emp_name FROM employees ) GROUP BY dept_id; ``` 此查询确保每个员工姓名仅出现一次,再进行字符串聚合[^1]。 #### 注意事项 - `LISTAGG` 的结果长度有限制(默认为 4000 字符),超出后会抛出 `ORA-01489` 错误。为避免此问题,可使用 `ON OVERFLOW TRUNCATE` 选项(适用于 Oracle 12.2 及以上版本): ```sql SELECT dept_id, LISTAGG(emp_name, ', ' ON OVERFLOW TRUNCATE) WITHIN GROUP (ORDER BY emp_name) AS employees FROM employees GROUP BY dept_id; ``` 该语句在字符串超出长度限制时自动截断并添加省略号,而不是抛出错误[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值