首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/SQL将一行拆分为多行

PL/SQL将一行拆分为多行
EN

Stack Overflow用户
提问于 2016-09-19 05:13:37
回答 2查看 124关注 0票数 0

我有这样的桌子。

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

我需要将值分成三列,并使用REGEXP_SUBSTR。这是我的密码。

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-19 06:38:52

试着做这样的事情:

代码语言:javascript
复制
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返回数字到156 (52*3) (或任何您需要的)

steps -是147等与step 3的数字

结果:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-09-19 06:43:06

我试过使用正则表达式

并将部分参数值列值转换为公共分隔值。

代码语言:javascript
复制
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 <>','

我希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39565793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档