Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyrażenie regularne Oracle dzieli ciąg znaków z ostatniego wystąpienia

Możesz to zrobić bez podwójnego odwrócenia, wyodrębniając różne grupy przechwytywania (otoczone okrągłym () nawiasy):

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

Możesz nawet znacznie uprościć wyrażenie regularne, używając po prostu:

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

Pierwszy .+ jest chciwy, więc będzie pasował tak dużo, jak to możliwe, dopóki nie zostanie tylko tyle łańcucha, ile wystarczy na minimum dopasowań w 2. - 4. grupie przechwytującej.

Nie potrzebujesz jednak wyrażeń regularnych :

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
);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyeksportować tabelę do pliku CSV za pomocą Oracle SQL Developer?

  2. Grupuj Oracle część wiersza i uzyskaj wiersz z najnowszym znacznikiem czasu

  3. Optymalizacja zapytania SELECT, które działa wolno w Oracle, które działa szybko w SQL Server

  4. Jak wybrać podciąg w Oracle SQL do określonego znaku?

  5. AKTUALIZACJA ODP.NET... POWRÓT DO... wielu wierszy, Typ parametru