日期:2014-05-17 浏览次数:20838 次
with t1 as ( select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3 from dual union all select '李四','胸外科',date'2001-01-04' from dual union all select '王五','妇产科,骨科',date'2001-01-08' from dual ) select c1, substr(','||c2||',',instr(','||c2,',',1,b.rn)+1, instr(c2||',',',',1,b.rn)-instr(','||c2,',',1,b.rn)) c2,c3 from t1, (select rownum rn from t1 connect by rownum<10) b where length(c2)-length(replace(c2,','))+1>=b.rn order by c1,b.rn c1 c2 c3 ----------------------------------------------- 1 李四 胸外科 2001/1/4 2 王五 妇产科 2001/1/8 3 王五 骨科 2001/1/8 4 张三 胸外科 2000/11/19 5 张三 皮肤科 2000/11/19
------解决方案--------------------
借上面的数据用一下
with t1 as ( select '张三' c1,'胸外科,皮肤科,骨科1,骨科2,骨科3,骨科4,骨科5,骨科6,骨科7,骨科8,骨科9,骨科10,骨科11,骨科12,骨科13,骨科14,骨科15,骨科16,骨科17' c2,date'2000-11-19' c3 from dual union all select '李四','胸外科',date'2001-01-04' from dual union all select '王五','妇产科,骨科',date'2001-01-08' from dual ) select DISTINCT c1 ,c3 ,REPLACE( -- 去除多余的【,】 regexp_substr(c2||',' ,'.*?'||'[,]' ,1 ,LEVEL) -- 截取 ,【科室】, ,',') "科室" from t1 connect by level <= nvl( length(regexp_replace(c2,'[^,]','')) + 1 ,1) order by c1;