PLSQL 在第 N 次和第 M 次出现字符之间选择 substr

Posted

技术标签:

【中文标题】PLSQL 在第 N 次和第 M 次出现字符之间选择 substr【英文标题】:PLSQL select substr between Nth and Mth occurance of character 【发布时间】:2016-06-15 14:41:33 【问题描述】:

我确信有一个简单的函数可以解决这个问题,但我似乎找不到它......

我有一个包含多个斜杠的字符串,例如 URL。假设我想获取斜杠的第二次和第四次出现之间的子字符串(如果存在),否则我想要第二个斜杠之后的所有内容,或者如果它包含少于 2 个斜杠,则只需 ""。

因此:'ab/cd/ef/gh/ij' 应选为'ef/gh''abc/d' 应选为''

我正在寻找的神奇功能/功能组合是什么?尝试使用 substr 和 regexp_substr,但它很快就变得一团糟,没有想要的结果。

【问题讨论】:

【参考方案1】:

显然我搜索的不够努力。函数instr 可以解决问题,因此与substr 结合使用:

SUBSTR(string, INSTR(string,'/',1,2) + 1, INSTR(string,'/',1,4) - INSTR(string,'/',1,2)-1)

虽然对我来说仍然看起来有点脏,但创造力是非常受欢迎的。

【讨论】:

这几乎就是我通常会这样做的方式。将其封装在一个函数中,以便您的其余代码看起来很干净:)【参考方案2】:

试试这个。我怀疑正则表达式可能更简单,但它符合您的要求。请注意,在 case 语句中对字符串进行测试的顺序非常重要,以免 str 落入错误的测试中。

with tbl(rownbr, str) as (
  select 1, 'ab/cd/ef/gh/ij/x/x/x' from dual union
  select 2, 'aa/bb/cc'             from dual union
  select 3, 'gg/hh/ii/jj'          from dual union
  select 4, 'abc/d'                from dual union
  select 5, 'zz'                   from dual
)
select rownbr, 
       case 
         when regexp_count(str, '/') > 4 then
           regexp_replace(str, '^.*?/.*?/(.*?/.*?)/.*$', '\1')
         when regexp_count(str, '/') < 2 then
           NULL    
         when regexp_count(str, '/') < 4 then
           regexp_replace(str, '^.*?/.*?/(.*)$', '\1')
       end  result
from tbl;

【讨论】:

以上是关于PLSQL 在第 N 次和第 M 次出现字符之间选择 substr的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 如何回滚之前的第 4 次和第 5 次迁移

为啥函数第一次调用比第二次和第三次调用花费更多的时间等等?

使用 Javascript 在主题之间切换

c语言中如何在一个字符串中查找/出现的位置?需要第一次出现和第二次出现中间的内容和第二次出现和第三

在第 n 次出现字符时剪切字符串

SQL Regex 在第二个和第三个正斜杠之间选择字符串