#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>