一张表如下 c1  c2
 1  B1210,B1211,B1212;50,100,75;BOX,BOX,BOX;100,200,150;KG,KG,KG'
 2  B1220,B1221,B1222,B1223;50,100,75,60;BOX,BOX,BOX,BOX;100,200,150,100;KG,KG,KG,KG
 3  B1120,B1121 ;50,100;BOX,BOX;100,200;KG,KG现在想转成: c1 编号     数量   包装  重量  单位
 1  B1210    50    BOX  100   KG
 1  B1211    100   BOX  200   KG
 .
 .
 .
 3 B1121     100   BOX  200   KG这仅仅是一部分示例数据, C2里面字符串里比如B1220,B1221,B1222,B1223 的个数都是不确定的。
所以我写了一个函数 去处理 返回一个结果集  但是结果集不可一做为一个字段,放在from 后面也是有问题的。有没有谁有解决办法?谢谢了

解决方案 »

  1.   

    我提供一个想法啊,就是写一个判断,把','定义为换行符,遇到逗号就换行,这是我看SQLLDR时看到的一种装载数据的设置方法,希望对你有帮助
      

  2.   

    with test as (
    select '1' as str1,'B1220,B1221,B1222,B1223;50,100,75,60;BOX,BOX,BOX,BOX;100,200,150,100;KG,KG,KG,KG' as str2 from dual
    )
    select str1,
           regexp_substr(str21, '\w+', 1, level) as str21,
           regexp_substr(str22, '\w+', 1, level) as str22,
           regexp_substr(str23, '\w+', 1, level) as str23,
           regexp_substr(str24, '\w+', 1, level) as str24,
           regexp_substr(str25, '\w+', 1, level) as str25
      from (select str1,
                   max(decode(rn, 1, str)) as str21,
                   max(decode(rn, 2, str)) as str22,
                   max(decode(rn, 3, str)) as str23,
                   max(decode(rn, 4, str)) as str24,
                   max(decode(rn, 5, str)) as str25
              from (select rownum as rn,
                           str1,
                           regexp_substr(str2, '[^;]+', 1, level) as str
                      from test
                    connect by level <= 5)
             group by str1)
    connect by regexp_substr(str21, '\w+', 1, level) is not null===========================================================
    1 1 B1220 50 BOX 100 KG
    2 1 B1221 100 BOX 200 KG
    3 1 B1222 75 BOX 150 KG
    4 1 B1223 60 BOX 100 KG