如何在不使用正则表达式的情况下获取oracle中第四和第五斜杠(/)之间的字符串

How to get string in between forth and fifth slash(/) in oracle without using regular expressions

我有如下字符串

/doc/Alldocs/attachment/2345455/122222/0/C/0%20%XYZ%ABC%20K

我需要获取第四个和第五个斜线之间的字符串,这意味着 2345455

目前我正在使用 REGEXP_SUBSTR 来获取结果。

REGEXP_SUBSTR('/doc/Alldocs/attachment/2345455/122222/0/C/0%20%XYZ%ABC%20K', '[^/ ]+', 1, 4)

但这确实影响了性能,在我的数据库中需要很长时间才能 return 结果。

有没有其他方法可以更快地获取此信息?像 split, Instr 之类的东西??

我是 oracle 的新手,你能帮我解决这个问题吗?

这里是 substrìnstr

的快速解决方案
  • 首先可以得到一个字符串/doc/Alldocs/attachment/2345455

    substr(str, 1, length(substr(str,1,instr(str,'/',1,5)))-1)
    
  • 字符串的第一部分

    with tab as(
      select '/doc/Alldocs/attachment/2345455/122222/0/C/0%20%XYZ%ABC%20K' as str from dual
    )
    select  substr(
               substr(str, 1, length(substr(str,1,instr(str,'/',1,5)))-1)
           ,instr(str,'/',1,4)+1)
      from tab
    

像往常一样使用旧的 SUBSTR + INSTR 组合。

SQL> with test (col) as
  2    (select '/doc/Alldocs/attachment/2345455/122222/0/C/0%20%XYZ%ABC%20K' from dual)
  3  select substr(col, instr(col, '/', 1, 4) + 1,
  4                     instr(col, '/', 1, 5) - instr(col, '/', 1, 4) - 1
  5               ) result
  6  from test;

RESULT
-------
2345455

SQL>
  • 第一个INSTR搜索第4个斜杠
  • 第二个INSTR搜索第5个斜杠位置并减去第4个斜杠的位置-结果是要检索的字符串的长度。