Oracle
 sql >> база данни >  >> RDS >> Oracle

Разделен низ с регулярен израз на Oracle от последно срещане

Можете да го направите без двойното обръщане, като извлечете различни групи за улавяне (оградени в кръг () скоби):

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

Можете дори да направите регулярния израз много по-опростен, като просто използвате:

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

Първият .+ е алчен, така че ще съвпада колкото е възможно повече, докато остане достатъчно от низа за минималните съвпадения на 2-ра - 4-та групи за улавяне.

Нямате обаче нужда от регулярни изрази :

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. Изключение за нарушение на ограничение ORA-00001

  2. стартирайте sql код на oracle онлайн

  3. Как да добавя ojdbc jar към моя проект и да го използвам

  4. Как да изчистите опашка в Oracle AQ

  5. Oracle Connection String за RAC среда?