REGEXP_SUBSTR Oracle 9i 中的等效函数?

REGEXP_SUBSTR function equivalent in Oracle 9i?

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

我知道 regexp_substr 从 Oracle 10g 开始。

正在尝试找出一种方法,如果我可以在 Oracle 9i 中使用相同的函数逻辑。

我有

这样的数据
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。如果你的数据库版本是 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