SQL Извлекает строки между символами или до конца строки

#sql #oracle #split

Вопрос:

Я пытаюсь извлечь строку между двумя символами, а также до конца строки, как показано ниже

Ввод:

 Id=3117;GrpType=UPDATE_116;Status=X
 

Вывод, который мне нужен, как показано ниже:

 3117
UPDATE_116
X
 

Я использую приведенный ниже запрос, но не получаю точного результата

 SELECT regexp_substr('Id=3117;GrpType=UPDATE_116;Status=X', '.*[^Id=] ') FROM DUAL;

SELECT regexp_substr('Id=3117;GrpType=UPDATE_116;Status=X', '.*[^GrpType=] ') FROM DUAL;

SELECT regexp_substr('Id=3117;GrpType=UPDATE_116;Status=X', '.*[^Status=] ') FROM DUAL;
 

Ответ №1:

Зачем беспокоиться о регулярных выражениях; substr instr делайте это красиво:

 SQL> with test (col) as
  2    (select 'Id=3117;GrpType=UPDATE_116;Status=X' from dual)
  3  select substr(col, instr(col, '=', 1, 1)   1,
  4                     instr(col, ';', 1, 1) - instr(col, '=', 1, 1) - 1
  5               ) id,
  6         substr(col, instr(col, '=', 1, 2)   1,
  7                     instr(col, ';', 1, 2) - instr(col, '=', 1, 2) - 1
  8               ) GrpType,
  9         substr(col, instr(col, '=', 1, 3)   1) status
 10  from test;

ID   GRPTYPE    STATUS
---- ---------- ----------
3117 UPDATE_116 X

SQL>
 

Или регулярное выражение:

 SQL> with test (col) as
  2    (select 'Id=3117;GrpType=UPDATE_116;Status=X' from dual)
  3  select ltrim(regexp_substr(col, '=w ', 1, level), '=') result
  4  from test
  5  connect by level <= regexp_count(col, '=');

RESULT
-----------------------------------
3117
UPDATE_116
X

SQL>