REGEXP_SUBSTR函数在Oracle 9i中等效吗?

时间:2018-10-29 06:55:31

标签: sql regex oracle split oracle9i

在Oracle 9i中$ readlink -f $(which sh) /bin/dash $ type sh sh is /bin/sh 是否具有等效功能。

我知道regexp_substr始于Oracle 10g。

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

我有类似

的数据
regexp_substr

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

我尝试使用0/6/03/19 0/6/3/19 0/1/3/09 substr,但是它不是通用的,因为斜线之间的字符串长度可以改变。

1 个答案:

答案 0 :(得分:0)

很遗憾,您只能将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