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的主要内容,如果未能解决你的问题,请参考以下文章