Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Geteilte Zeichenfolge des regulären Oracle-Ausdrucks vom letzten Vorkommen

Sie können dies ohne die doppelte Umkehrung tun, indem Sie verschiedene Erfassungsgruppen extrahieren (umgeben von runden () Klammern):

WITH t ( VAL ) AS (
  SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
  SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 1 ) AS COL4,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 2 ) AS COL3,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 3 ) AS COL2,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 4 ) AS COL1
FROM   t

Sie könnten den regulären Ausdruck sogar viel einfacher machen, indem Sie einfach verwenden:

'^(.+)_(.+)_(.+)_(.+)$'

Das erste .+ ist gierig, so dass so viele Übereinstimmungen wie möglich gefunden werden, bis nur noch genug Zeichenfolge für die Mindestübereinstimmungen in der 2. bis 4. Fanggruppe übrig ist.

Sie benötigen jedoch keine regulären Ausdrücke :

WITH t ( VAL ) AS (
  SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
  SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT SUBSTR( val, 1,        pos1 - 1        ) AS col4,
       SUBSTR( val, pos1 + 1, pos2 - pos1 - 1 ) AS col3,
       SUBSTR( val, pos2 + 1, pos3 - pos2 - 1 ) AS col2,
       SUBSTR( val, pos3 + 1                  ) AS col1
FROM   (
  SELECT val,
         INSTR( val, '_', -1, 1 ) AS pos3,
         INSTR( val, '_', -1, 2 ) AS pos2,
         INSTR( val, '_', -1, 3 ) AS pos1
  FROM   t
);