如何在2斜杠之间提取值

时间:2018-02-07 10:14:21

标签: sql oracle11g

我有一个字符串,如" 1490/2334/5166400411000434"我需要在第二次斜线后得出值。我尝试了以下逻辑

select REGEXP_SUBSTR('1490/2334/5166400411000434','[^/]+',1,3) from dual;

工作正常。但是,当我在第一次和第二次斜线之间没有价值时,它正在返回空白。 例如,我的字符串是" 1490 // 5166400411000434"我正在尝试

select REGEXP_SUBSTR('1490//5166400411000434','[^/]+',1,3) from dual;

它返回空白。
请告诉我我错过了什么。

3 个答案:

答案 0 :(得分:1)

如果我理解得很好,你可能需要

regexp_substr(t, '(([^/]*/){2})([^/]*)', 1, 1, 'i', 3)

这将处理前两个部分,如'xxx/',然后检查一系列非/个字符;参数3用于获取第3个匹配的子表达式,这就是您想要的。 例如:

with test(t) as (
    select '1490/2334/5166400411000434' from dual union all
    select '1490//5166400411000434' from dual union all
    select '1490//5166400411000434/ramesh/3344' from dual
)
select t, regexp_substr(t, '(([^/]*/){2})([^/]*)', 1, 1, 'i', 3) as substr
from test    

给出:

T                                  SUBSTR                            
---------------------------------- ----------------------------------
1490/2334/5166400411000434         5166400411000434                  
1490//5166400411000434             5166400411000434                  
1490//5166400411000434/ramesh/3344 5166400411000434    

答案 1 :(得分:0)

你可以REVERSE()你的字符串并在第一个斜杠之前取值。然后再次反转以获得所需的输出。

select reverse(regexp_substr(reverse('1490//5166400411000434'), '[^/]+', 1, 1)) from dual;

也可以使用基本的子串和instr函数来完成:

select reverse(SUBSTR(reverse('1490//5166400411000434'), 0, INSTR(reverse('1490//5166400411000434'), '/')-1)) from dual;

答案 2 :(得分:0)

使用REGEXP_SUBSTR中的其他选项来匹配pattren

threshold_cur: ${thr_cur}

基本上它是找到两个/包括从1开始的数字,包括1个外观并忽略空格('x')然后在()中输出第二个表达式的第二个表达式 ... pattern,1,1,'x',subexp2)