Oracle查询,将某列查询结果用逗号隔开,拼接成一行(listagg函数、xmlagg函数)...

需求:Oracle数据库,通过查询,将查询字段的该列结果用逗号拼接成一行。


1. 查询语法

1.1 listagg函数

select listagg(查询拼接字段,',') within group (order by 排序字段) as 查询显示字段
  from 表名 where 条件

1.2 xmlagg函数

select xmlagg(xmlparse(content 查询拼接字段 || ','wellformed) order by 排序字段).getclobval() as 查询显示字段
  from 表名 where 条件

区别:

listagg函数:返回结果为varchar2格式的数据,即拼接后的字符串最大可以保存4000字节的数据,所以大于这个数据的字符串就会报ORA-01489 字符串连接的结果过长的错误。

xmlagg函数:当查询结果过长,拼接的字符串长度过长大于4000字节,我们可以使用这个函数,函数返回结果为CLOB类型,大对象数据类型最大可以存储4GB的数据长度。

2. 示例对比:

2.1 原始查询结果

select emp_uid from PRS_CALC_DATA where agency_code='101002' and prtype_code='002'

2.2 用listagg函数查询之后的结果

select listagg(emp_uid,',') within group (order by emp_uid) as emp_uid
  from PRS_CALC_DATA where agency_code='101002' and prtype_code='002'

2.3 用xmlagg函数查询之后的结果

3. 应用示例

  给100个人计算工资,计算的后台接口统计的是工资编制表中每个人员对应的id值,故需要将该id值查询出来传给计算接口。实现如下:

3.1 查询语句

3.2 提取查询结果

3.3 传入查询结果 

3.4 查看结果

*****************************************************************************************************************************************************************************************************************

如果不使用listagg函数,会只计算一个人的工资(因为只传入了一个id值)。示例如下:

*****************************************************************************************************************************************************************************************************************

 ****************************************************************************************************************************************************************************************************

上述过程只是一个演示,实际性能测试,如果可以从系统的后端接口提取ID,则应该提取,而不是从数据库直接查询(不能体现系统性能,结果会优于实际性能),简要如下:*****************************************************************************************************************************************************************************************************

### Oracle SQL 中拼接查询结果Oracle 数据库中,有多种方式可以将一查询结果拼接单个字符串。以下是几种常见的方法: #### 方法一:使用 `LISTAGG` 函数 `LISTAGG` 是一种非常方便的方式来进行字符串聚合操作。 ```sql SELECT LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_name) AS concatenated_result FROM table_name; ``` 此函数会按照指定顺序连接同一组内的多行数据,并以逗号分隔[^1]。 #### 方法二:利用 `SYS_CONNECT_BY_PATH` 和 `ROW_NUMBER()` Over 分析函数组合 这种方法适用于较旧版本不支持 `LISTAGG` 的情况。 ```sql WITH numbered_rows AS ( SELECT column_name, ROW_NUMBER() OVER () AS rn FROM table_name ) SEARCH DEPTH FIRST BY rn SET order_id SELECT MAX(SYS_CONNECT_BY_PATH(column_name, ',')) KEEP(DENSE_RANK LAST ORDER BY rn) AS concatenated_result FROM numbered_rows CONNECT BY PRIOR rn = rn - 1; ``` 这段代码先给每一行编号再通过层次化查询来构建路径完最终的串连工作[^2]。 #### 方法三:基于 `WM_CONCAT` 或者自定义聚集函数 对于某些特定场景下的需求也可以考虑采用内置但已过时的 `WM_CONCAT` 函数或是创建自己的聚集函数实现相同效果。 ```sql -- 使用 WM_CONCAT 进行简单拼接(注意该功能已被官方弃用) SELECT REPLACE(WM_CONCAT(column_name), ',', '*****') AS customized_delimiter_result FROM table_name; -- 自定义 PL/SQL 聚集函数示例省略... ``` 需要注意的是,由于性能原因以及维护性考量,在现代应用开发实践中推荐优先选用 `LISTAGG` 方案除非确实存在兼容性障碍][^[^34]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值