regex oracle sql возвращает все группы захвата

У меня есть регулярное выражение вроде

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, который может возвращать значение для одной группы захвата. Как я могу вместо этого вернуть все группы захвата в виде дополнительного столбца? (строка concat результатов в порядке)

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

person Georg Heiler    schedule 07.08.2017    source источник
comment
В вашем регулярном выражении есть только одна группа захвата, и она даст только одно совпадение. Можете ли вы привести пример, когда есть несколько групп захвата или несколько совпадений и ваш ожидаемый результат.   -  person MT0    schedule 07.08.2017
comment
Извините, теперь с TOTAL_SCORE<518> TOTAL_SCORE<123> должно быть 2 совпадения   -  person Georg Heiler    schedule 07.08.2017


Ответы (1)


Запрос 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

Вывод:

SCORES
-------
518,456

Запрос 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;

Вывод:

SCORES
-------
    518
    123
person MT0    schedule 07.08.2017