Эквивалент функции REGEXP_SUBSTR в Oracle 9i? - PullRequest
0 голосов
/ 29 октября 2018

Есть ли эквивалентная функция для regexp_substr в Oracle 9i.

Я знаю, regexp_substr пришел в Oracle 10g и более.

Попытка выяснить, можно ли использовать ту же логику функций в Oracle 9i.

У меня есть данные типа

0/6/03/19
0/6/3/19
0/1/3/09

Я хочу выбрать значения отдельно, разделив строку с помощью /.

Я попытался использовать substr и instr, но это не будет общим, поскольку длина строки между слешами может измениться.

1 Ответ

0 голосов
/ 29 октября 2018

К сожалению, вы можете использовать только комбинацию instr и substr как:

with t as
(
  select '0/6/03/19' as str from dual union all
  select '0/6/3/19' from dual
)
select substr(str,1,instr(str,'/',1,1)-1) str1,
       substr(str,instr(str,'/',1,1)+1,instr(str,'/',1,2)-instr(str,'/',1,1)-1) str2,
       substr(str,instr(str,'/',1,2)+1,instr(str,'/',1,3)-instr(str,'/',1,2)-1) str3,
       substr(str,instr(str,'/',1,3)+1,length(str)-instr(str,'/',1,3)) str4
  from t;

STR1    STR2    STR3    STR4
----    ----    ----    ----
 0       6       03      19
 0       6        3      19

P.S. Если версия вашей БД 9.2, тогда можно использовать структуру with .. as, как указано выше.

Вы также можете получить результаты по строкам не в сводном порядке ) как:

with t as
(
 select '/'||str||'/' as str, ID
   from
   (
    select 1 as ID, '0/6/03/19' as str from dual union all
    select 2,'0/6/3/19' from dual
   )
)
select
      distinct ID, level as piece_nr,
      substr(str,instr(str,'/',1,level)+1,instr(str,'/',1,level+1)-instr(str,'/',1,level)-1)
      as piece_value
  from ( select * from t )
connect by level <= length(str)-length(replace(str,'/',''))-1
  order by ID, level;

ID  PIECE_NR    PIECE_VALUE
--  --------  -----------
1        1           0
1        2           6
1        3           03
1        4           19
2        1           0
2        2           6
2        3           3
2        4           19
...