PL / SQL拆分一行到多行

时间:2016-09-19 05:13:37

标签: regex oracle loops plsql split

我有一张这样的桌子。

  

|PARAMKEY | PARAMVALUE ----------+------------ KEY |[["PAR_A",2,"SCH_A"],["PAR_B",4,"SCH_B"],["PAR_C",3,"SCH_C"]]

我需要将值拆分为三列,然后使用REGEXP_SUBSTR。这是我的代码。

SELECT REGEXP_SUBSTR(paramvalue, '[^],["]+', 1,1 ) PARAMETER
       ,REGEXP_SUBSTR(paramvalue, '[^],[",]+', 1, 2) VERSION
       ,REGEXP_SUBSTR(paramvalue, '[^],["]+', 1, 3) SCHEMA
       FROM   tmp_param_table
where paramkey = 'KEY'
       UNION ALL 
SELECT REGEXP_SUBSTR(paramvalue, '[^],["]+', 1, 4 ) PARAMETER
       ,REGEXP_SUBSTR(paramvalue, '[^],[",]+', 1, 5) VERSION
       ,REGEXP_SUBSTR(paramvalue, '[^],["]+', 1, 6) SCHEMA
       FROM   tmp_param_table
where paramkey = 'KEY'
       UNION ALL 
SELECT REGEXP_SUBSTR(paramvalue, '[^],["]+', 1, 7 ) PARAMETER
       ,REGEXP_SUBSTR(paramvalue, '[^],[",]+', 1, 8) VERSION
       ,REGEXP_SUBSTR(paramvalue, '[^],["]+', 1, 9) SCHEMA
       FROM   tmp_param_table
where paramkey = 'KEY';

这是我需要的结果。

  

PARAMETER | VERSION | SCHEMA ---------+---------+------- PAR_A |2 |SCH_A PAR_B |4 |SCH_B PAR_C |3 |SCH_C

但是这个值太长了,我希望有另一种方法可以通过使用循环或任何东西来简化它。 感谢

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

with tmp_param_table as
(
select 'KEY' as PARAMKEY  ,  '[["PAR_A",2,"SCH_A"],["PAR_B",4,"SCH_B"],["PAR_C",3,"SCH_C"]],["PAR_D",4,"SCH_D"]]' as PARAMVALUE from dual 
),
levels as        (select level as lv   from dual connect by level <= 156),
steps as (select lv-2  as step from levels  where MOD(lv,3)=0)
select step, (SELECT REGEXP_SUBSTR(paramvalue, '[^],["]+',1, step ) PARAMETER  FROM   tmp_param_table where paramkey = 'KEY')  parameter, 
             (SELECT REGEXP_SUBSTR(paramvalue, '[^],["]+',1, step+1 ) PARAMETER  FROM   tmp_param_table where paramkey = 'KEY') version,
             (SELECT REGEXP_SUBSTR(paramvalue, '[^],["]+',1, step+2 ) PARAMETER  FROM   tmp_param_table where paramkey = 'KEY') schema
               from  steps

此处

levels - 将数字从1返回到15652*3)(或您需要的任何内容)

steps - 数字为147等,其中包含步骤3

<强>结果:

1   PAR_A   2   SCH_A
4   PAR_B   4   SCH_B
7   PAR_C   3   SCH_C
10  PAR_D   4   SCH_D
13                    
etc..

答案 1 :(得分:0)

我尝试过使用正则表达式

和部分paramvalue列值为公共分隔值

SELECT 
REGEXP_SUBSTR(COL, '[^],["]+', 1, 1) PARAMETER,
REGEXP_SUBSTR(COL, '[^],[",]+', 1, 2) VERSION,
REGEXP_SUBSTR(COL, '[^],["]+', 1, 3) SCHEMA
FROM
(
SELECT paramkey,REGEXP_SUBSTR(to_char(paramvalue),'[^][^]+',1,level ) COL
 from tmp_param_table
connect by regexp_substr(to_char(paramvalue),'[^][^]+',1, level) is not null
)
WHERE COL <>','

我希望这可能有所帮助。