REGEXP_SUBSTR函数等效于Oracle 9i



Oracle 9i中是否存在regexp_substr的等效函数。

我知道regexp_substr是在Oracle 10g以后的版本中出现的。

试图找出一种方法,如果我可以在Oracle9i中使用相同的函数逻辑。

我有类似的数据

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

我想通过用/分隔字符串来分别挑选值。

我尝试使用substrinstr,但它不会是通用的,因为斜线之间的字符串长度可能会改变。

遗憾的是,您只能将instrsubstr的组合用作:

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.如果您的DB版本是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

最新更新