2017-04-26 9 views
0

Ich versuche, mehrere Zeilen nach dem Ausführen einer Regex für eine Spalte, die alle Werte in eckigen Klammern teilen. Ich kann jedoch momentan nur einen einzelnen Wert zurückgeben.Oracle Regex Connect von

Das Feld I die Regex bin Durchführung hat diesen Wert:

[1265] * [1263]

Ich versuche, 1265 und 1263 in meinem Ergebnis als separate Reihen gesetzt zu bekommen.

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

Stattdessen bekomme ich das nur in der Ergebnismenge.

[1263]

+0

Sind die Werte immer ganze Zahlen? – Aleksej

+0

Ihr Code teilt diese Zeichenfolge in zwei Zeilen auf, wenn ich sie ausführe. – APC

+0

Es gibt zwei Zeilen zurück, aber eins ist null und das andere ist ausgefüllt. – user1060187

Antwort

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

Diese Regex zählt Elemente durch die Suche nach Klammern und gibt die Ziffern in den Klammern zu schließen, für NULL-Werte erlaubt. Trennzeichen werden ignoriert, da die gewünschten Datenelemente von eckigen Klammern umgeben sind, auf die wir uns konzentrieren können.

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>