日期:2014-05-17  浏览次数:20807 次

oracle某表的一个字段有多值,怎么把这值变成多行,其它数据为一样
oracle某表的一个字段有多值,怎么把这值变成多行,其它数据为一样
如有字段 A,B,C ;C为多值,如(1,2,3,或1,2,3)用逗号隔开
那就要有三行

------解决方案--------------------
select a,b,regexp_substr(c,'[^,]+',1,n) c from 
table t,(select level n from dual connect by level<=10) extend_rows
where regexp_substr(c,'[^,]+',1,n) is not null
------解决方案--------------------

with t1 as
(
     select 'a,b,c' c1 from dual
)

select distinct regexp_substr(c1, '[^,]+',1,level) c1
from t1
connect by level <= length(c1) - length(replace(c1,',','')) + 1

     c1
----------------------------
1 a
2 b
3 c


------解决方案--------------------
select a,b,regexp_substr(c,'[^,]+',1,level,'i') c from 
t1
connect by level <= length(c) - length(replace(c,',','')) + 1

------解决方案--------------------
可以把最后一个,先截取掉


with t1 as
(
     select 1 id,'a,b,c' c1 from dual union all
     select 2,'d,e,' c1 from dual 
)
 
select distinct id, 
      regexp_substr(decode(substr(c1,-1),',',substr(c1,1,length(c1)-1),c1), '[^,]+',1,level) c1
from t1
connect by level <= length(decode(substr(c1,-1),',',substr(c1,1,length(c1)-1),c1)) - length(replace(c1,',','')) + 1

     id     c1
------------------------
1 1 a
2 1 c
3 1 b
4 2 d
5 2 e