我确定这个问题有一个简单的功能,但我似乎无法找到它...
我有一个包含多个斜杠的字符串,例如一个URL。让我们说我想获得斜杠的第二次和第四次出现之间的子串,如果存在,否则我希望一切都跟在第二次斜杠之后或者只是""如果它包含少于2个斜杠。
因此:'ab/cd/ef/gh/ij'
应选为'ef/gh'
,'abc/d'
应选为''
。
我正在寻找的神奇功能/功能组合是什么?尝试使用substr和regexp_substr,但它很快就乱了,没有预期的结果。
答案 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;