【问题标题】:PL/SQL split one to many rowsPL/SQL 拆分一对多行
【发布时间】:2016-09-19 05:13:37
【问题描述】:

我有一张这样的桌子。

|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

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

【问题讨论】:

标签: regex oracle loops plsql split


【解决方案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 - 从1156 (52*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..

【讨论】:

    【解决方案2】:

    我尝试过使用正则表达式

    和部分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 <>','
    

    我希望这会有所帮助。

    【讨论】:

    • 如此接近。我必须删除 where 子句,因为我收到错误 ORA-00932:不一致的数据类型:预期 - 得到 CLOB 00932。00000 -“不一致的数据类型:预期的 %s 得到 %s”*原因:*操作:行错误:11 列:7
    • 这里我漏掉了一些正则表达式,所以多出了两行逗号。
    • 在第 7 行和第 9 行将 paramvalue 更改为 to_char(paramvalue)。请参阅我已根据您的需要进行了编辑。
    • 是的。有用。我们只需要 AND ROWNUM
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2016-10-07
    • 2013-02-05
    • 2021-01-06
    相关资源
    最近更新 更多