字符串拆分成行

原表:
id item
 1 60,65
 1 87,35
 2 40,68,70

要得到的查询
id item
1 60
1 65
1 87
1 35
2 40
2 68
2 70

 

wildware(狂浪)的方法:

WITH A AS(SELECT 1 id,'60,65' item FROM dual
 
UNION ALL SELECT 1,'87,35' FROM dual
 
union all select 2,'40,68,70' from dual)
 
   
select a.id,substr(a.item,instr(','||a.item,',',1,b.rn),instr(a.item||',',',',1,b.rn)-instr(','||a.item,',',1,b.rn))item
      
from a,
       (
select * from
          (
SELECT DISTINCT id FROM A),
          (
SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM<=(
           
select max(length(item)-length(replace(item,',')))+1 from a)))b
   
WHERE A.ID=b.ID
     
and length(a.item)-length(replace(a.item,',',''))+1>=b.rn

 

我自己的方法:

with tmp as
(

select 1 id, '60,65' item from dual
union all
select 1 id, '87,35' item from dual
union all
select 2 id, '40,68,70' item from dual
)
select distinct id,
substr(regexp_substr(
',' || item, ',([^,]+)', 1, level), 2) as "item"

from tmp
connect
by level <= length(regexp_replace(item, '[^,]', '')) + 1
order by id

其中,如果没用distinct,会多很多重复的记录,有待研究。

 

http://topic.csdn.net/u/20100519/15/b4f57815-703b-444d-a3eb-20d882c158b5.html?seed=1950080834&r=65556765#r_65556765

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值