PLSQL在第N个和第M个字符之间选择substr

时间:2016-06-15 14:41:33

标签: regex plsql substring

我确定这个问题有一个简单的功能,但我似乎无法找到它...

我有一个包含多个斜杠的字符串,例如一个URL。让我们说我想获得斜杠的第二次和第四次出现之间的子串,如果存在,否则我希望一切都跟在第二次斜杠之后或者只是""如果它包含少于2个斜杠。

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

我正在寻找的神奇功能/功能组合是什么?尝试使用substr和regexp_substr,但它很快就乱了,没有预期的结果。

2 个答案:

答案 0 :(得分:1)

显然我的搜索力度不够。函数\.可以解决问题,因此与instr

结合使用
substr

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

答案 1 :(得分:0)

试一试。我怀疑正则表达式可以更简单,但它符合您的要求。请注意,在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;
相关问题