2017-04-26 15 views
0

大括弧で囲まれたすべての値を列で正規表現した後、複数の行を生成しようとしています。私は現在、単一の値を返すことができます。Oracle Regex Connect By

私は正規表現を行っておりますフィールドには、この値を持っています

[1265] * [1263]

私は別の行として設定私の結果に1265年と1263年を取得しようとしています。

SELECT REGEXP_SUBSTR(column,'\[(.*?)\]',1,LEVEL) AS "col1" 
FROM table 
CONNECT BY REGEXP_SUBSTR(column,'\[(.*?)\]',1,LEVEL) IS NOT NULL; 

代わりに、結果セットでこれを取得します。

[1263]

+0

値は常に整数ですか? – Aleksej

+0

あなたのコードは、実行時にその文字列を2つの行に分割します。 – APC

+0

2行を返しますが、1つはヌルで、もう1つは読み込まれます。 – user1060187

答えて

0
with test (rn, col) as 
( 
    select 'a', '[123]*[abc] []' from dual union all 
    select 'b', '[45][def] ' from dual union all 
    select 'c', '[678],.*' from dual 
), 
coll (rn, col) as 
(
    select rn,regexp_replace(col, '(\[.*?\])|.', '\1') from test 
), 
cte (rn, cnt, col, i) as 
(
    select rn, 1, col, regexp_substr(col, '(\[(.*?)\])', 1, 1, null, 2) 
    from coll 
    union all 
    select rn, cnt+1, col, regexp_substr(col, '(\[(.*?)\])', 1, cnt+1, null, 2) 
    from cte 
    where cnt+1 <= regexp_count(col, '\[.*?\]') 
) 
select * from cte 
order by 1,2; 
0

この正規表現は、閉鎖ブラケットを探して要素をカウントし、NULL値を考慮して、括弧内の数字を返します。区切り文字は無視されます。なぜなら、必要なデータ要素は大括弧で囲まれているからです。

SQL> with test(rownbr, col) as (
     select 1, '[1265]**[1263]' from dual union 
     select 2, '[123]'   from dual union 
     select 3, '[111][222]*[333]' from dual union 
     select 4, '[411]*[][433]' from dual 
    ) 
    select distinct rownbr, level as element, 
      regexp_substr(col, '\[([0-9]*)\]', 1, level, null, 1) value 
    from test 
    connect by level <= regexp_count(col, ']') 
    order by rownbr, element; 

    ROWNBR ELEMENT VALUE 
---------- ---------- ----- 
     1   1 1265 
     1   2 1263 
     2   1 123 
     3   1 111 
     3   2 222 
     3   3 333 
     4   1 411 
     4   2 
     4   3 433 

9 rows selected. 

SQL> 
関連する問題