2016-09-19 8 views
0

私はこのような表を持っています。PL/SQLは1行から複数​​行に分割されます

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

私は3つの列に値を分割する必要があると私は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

は、しかし、値が長すぎると私はsimplierループか何かを使って、それを作るために別の方法があると思います。 おかげ

+0

これを参照してください。 http://stackoverflow.com/documentation/oracle/1968/splitting-delimited-strings –

+0

PARAMVALUE列の長さはどのくらいですか? –

+0

@DmitryGrekov data_typeはclobなので、52行に値を選択する必要があります。 –

答えて

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 - 戻り番号の形式152*3156まで(またはものは何でもあなたが必要とする)を

stepsは - です数字1,4,7等のステップ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.. 
0

私はこの月を願って、共通の区切り値

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 <>',' 

に正規表現

と一部のparamvalue列の値を使用して試してみました助けて。

+0

ように。 ORA-00932:矛盾したデータ型:予期したCLOB 00932. 00000 - "矛盾したデータ型:予期した%sに%sがあります" *処置: 行のエラー: 11列:7 –

+0

ここで私はいくつかの正規表現を見逃しているので、カンマのために2つの余分な行があります。 –

+0

paramvalueを** to_char(paramvalue)**に7行目と9行目に変更します。あなたが必要に応じて編集したのを見てください。 –

関連する問題