2017-08-07 1 views
0

Ich habe eine Regex wieregex Oracle SQL zurückgeben alle einfangenden Gruppen

select regexp_substr('some stuff TOTAL_SCORE<518>some stuff OTHER_VALUE<456> foo <after>', 'TOTAL_SCORE<(\d{3})>', 1, 1, NULL, 1) from dual, die einen Wert für eine einzelne Erfassungsgruppe zurückkehren können. Wie kann ich stattdessen alle einfangenden Gruppen als zusätzliche Spalte zurückgeben? (String concat der Ergebnisse ist in Ordnung)

select regexp_substr('some stuff TOTAL_SCORE<518> TOTAL_SCORE<123>some stuff OTHER_VALUE<456> foo <after>', 'TOTAL_SCORE<(\d{3})>') from dual 
+0

Es gibt nur eine Erfassungsgruppe in Ihrem regulären Ausdruck, und es wird nur ein einziges Spiel machen. Können Sie ein Beispiel angeben, bei dem es mehrere Erfassungsgruppen oder mehrere Übereinstimmungen und Ihre erwartete Ausgabe gibt? – MT0

+0

Entschuldigung jetzt mit 'TOTAL_SCORE <518> TOTAL_SCORE <123>' es sollte 2 Übereinstimmungen geben –

Antwort

1

Abfrage 1:

-- Sample data 
WITH your_table (value) AS (
    SELECT 'some stuff TOTAL_SCORE<518>some stuff OTHER_VALUE<456> foo <after>' FROM DUAL 
) 
-- Query 
SELECT REGEXP_REPLACE(
     value, 
     '.*TOTAL_SCORE<(\d{3})>.*OTHER_VALUE<(\d{3})>.*', 
     '\1,\2' 
     ) As scores 
FROM your_table 

Output:

SCORES 
------- 
518,456 

Abfrage 2:

-- Sample data 
WITH your_table (value) AS (
    SELECT 'some stuff TOTAL_SCORE<518> TOTAL_SCORE<123> some stuff OTHER_VALUE<456> foo <after>' FROM DUAL 
) 
-- Query 
SELECT l.column_value As scores 
FROM your_table t, 
     TABLE(
     CAST(
      MULTISET(
      SELECT TO_NUMBER(
         REGEXP_SUBSTR(
         t.value, 
         'TOTAL_SCORE<(\d{3})>', 
         1, 
         LEVEL, 
         NULL, 
         1 
        ) 
        ) 
      FROM DUAL 
      CONNECT BY LEVEL <= REGEXP_COUNT(t.value, 'TOTAL_SCORE<(\d{3})>') 
      ) AS SYS.ODCINUMBERLIST 
     ) 
     ) l; 

Ausgang:

SCORES 
------- 
    518 
    123