oracle中字符串合并与拆分

本文介绍如何使用Oracle数据库的不同方法来合并同一部门的所有员工姓名为一个字符串,包括使用sys_connect_by_path、listagg以及wm_concat函数,并展示了如何将合并后的字符串进行拆分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例是在oralce示例数据库中执行

如现有需求要查找每个部门中的员工

SELECT DEPTNO, ENAME FROM EMP;

 

这样的结果并不是很直观,我们希望同部门的显示一行记录

------------------------------------------字符串合并-----------------------------------------------------------

with x1 as 
   (select deptno,
           ename, 
           row_number() over (partition by deptno order by ename) as rn from emp)
--select * from x1;
---用sys_connect_by_path合并字符串
select deptno,substr(sys_connect_by_path(ename,','),2)
from x1
where connect_by_isleaf=1
start with rn=1
connect by (prior rn)=rn-1
and (prior deptno)=deptno

 

 

oralce11g可以改为listagg

select deptno,listagg(ename,',')  within group (order by empno) from emp group by deptno;

 

 

很多人习惯用 wm_concat

但是它oracle一个未公开的内部函数,不同版本中返回类型也能存在差异(varchar或clob)

select deptno,wm_concat(ename) from emp group by deptno;

 

-------------------------------------------反操作-------------------------------------------------------------

with x2 as 
(select deptno,listagg(ename,',') within group (order by empno) as ename from emp  group by deptno)
select deptno,regexp_substr(ename,'[^,]+',1,level,'i')
from x2
connect by level<=regexp_count(ename,',')+1
and (prior deptno)=deptno
and (prior dbms_random.value()) is not null

 

转载于:https://www.cnblogs.com/xuzhong86/p/6208119.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值