首页 > 解决方案 > Oracle 9i 中的 REGEXP_SUBSTR 函数等效?

问题描述

regexp_substrOracle 9i 中是否有等效的功能。

我知道regexp_substr从 Oracle 10g 开始。

试图找出一种方法,如果我可以在 Oracle 9i 中使用相同的功能逻辑。

我有类似的数据

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

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

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

标签: sqlregexoraclesplitoracle9i

解决方案


不幸的是,您只能使用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

PS 如果您的数据库版本是 9.2,则with .. as可以使用上述结构。

您还可以按(以unpivot 方式)获得结果:

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

推荐阅读