单列多行转单行单列合并oracle_oracle简单按分隔符单行转多行sql

本文介绍了如何使用Oracle SQL将单列多行数据转换为单行单列,主要通过 substr、instr 和 connect by level 方法实现,并提供了一种更简洁的正则表达式方式。示例中展示了具体的SQL查询语句和转换过程。
摘要由CSDN通过智能技术生成

with tmp_t as

(select '1001' as userId, '10,12,15' as workgroups

from dual

union

select '1002' as userId, '2,4,5' as workgroups from dual)

select userid,

substr(tempgroups,

instr(tempgroups, ',', 1, lv) + 1,

instr(tempgroups, ',', 1, lv + 1) -

(instr(tempgroups, ',', 1, lv) + 1))

from (select userid,

',' || workgroups || ',' AS tempgroups,

length(workgroups || ',') -

nvl(length(replace(workgroups, ',')) , 0) AS groupcount

FROM tmp_t) a,

(select LEVEL lv from dual CONNECT BY LEVEL <= 5) b

where b.lv <= a.groupcount

order by userid, lv

结果为:

47684b1b88aacdf1aadf7973c12b1de4.png

使用了CONNECT BY 构造1-5的lv值和instr截取,详细分析见原文。

个人看到connect by level <=5总想这替换掉5,只要得到表中最大的,个数就可以了,如下:

with tmp_t as

(select '1001' as userid, '10,12,15' as workgroups

from dual

union

select '1002' as userid, '2,4,5' as workgroups from dual)

select userid,

substr(tempgroups,

instr(tempgroups, ',', 1, lv) + 1,

instr(tempgroups, ',', 1, lv + 1) -

(instr(tempgroups, ',', 1, lv) + 1))

from (select userid,

',' || workgroups || ',' as tempgroups,

length(workgroups || ',') -

nvl(length(replace(workgroups, ',')) , 0) as groupcount

from tmp_t) a,

(select level lv

from dual

connect by level <= (select max(length(workgroups) -

length(replace(workgroups, ',', ''))) + 1

from tmp_t)) b

where b.lv <= a.groupcount

order by userid, lv

更好的写法如下:

with tmp_t as

(select '1001' as userid, '10,12,15' as workgroups

from dual

union

select '1002' as userid, '2,4,5' as workgroups from dual)

select userid,

--regexp_substr(str,reg,起始位置 第几次)

regexp_substr(workgroups, '[^,]+', 1, level) clr

from tmp_t

connect by level <= regexp_count(workgroups, ',') + 1

--regexp_count(workgroups, ',') 统计字符串中,的数量

--用法参考http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions135.htm#SQLRF51665

and userid = prior userid

and prior dbms_random.value is not null

相当简洁,很不错的写法,结果和上面的一样。

全文完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值