select t1.c1,
       substr(t1.c2,
              instr(',' || t1.c2, ',', 1, t2.rn),
              instr(t1.c2 || ',', ',', 1, t2.rn) -
              instr(',' || t1.c2, ',', 1, t2.rn)) c2
  from tab t1, (select rownum rn from dual connect by rownum <= 20) t2
 where length(t1.c2) - length(replace(t1.c2, ',')) + 1 >= t2.rn
 order by t1.c1, t2.rn构造的t2里面,rownum<=后面的数字,可以适当调整,要大于c2中元素的个数

解决方案 »

  1.   


    版主,问下length(t1.c2) - length(replace(t1.c2, ',')) + 1 >= t2.rn这句是如何筛选取得想要的结果的
      

  2.   


    版主,问下length(t1.c2) - length(replace(t1.c2, ',')) + 1 >= t2.rn这句是如何筛选取得想要的结果的
    这里是通过计算c2中逗号的个数,来选择连接t2中对应的rn
      

  3.   


    版主,问下length(t1.c2) - length(replace(t1.c2, ',')) + 1 >= t2.rn这句是如何筛选取得想要的结果的
    这里是通过计算c2中逗号的个数,来选择连接t2中对应的rn恩,这个我知道,我想不通的是前面一段是计算出逗号的长度,然后>=t2.rn,这样的写法是如何
    将所有非空的结果集保留下来,而排除为空的结果的,麻烦版主了
      

  4.   

    非空?
    对应t1每一条记录的c2,有几个项,就扩展出几条来,所以利用t2来实现
    你把t1.c2和t2.rn也在结果集里展现就知道了