2017-08-07 98 views
0

我有一個像正則表達式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正則表達式可以返回一個捕獲組的值。 我該如何將所有捕獲組作爲附加列返回? (結果的字符串連接是細)

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

。在你的正則表達式只有一個捕獲組,它只會讓一個匹配。你能給出一個例子,其中有多個捕獲組或多個匹配以及您的預期輸出。 – MT0

+0

對不起,現在有'TOTAL_SCORE <518> TOTAL_SCORE <123>'應該有2場比賽 –

回答

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