Oracle 中棘手的子串用法

Tricky substring usage in Oracle

我正在寻找一种方法来始终检索字符串中最后一个“/”字符之后的 2 个数字。如果我想要的2个数字后面有什么,我不在乎。

我想出的代码是这样的:

CASE when INSTRUMENT like '%/%' then   SUBSTR(INSTRUMENT,INSTR(INSTRUMENT,'/',-3,1)+1,2) else '0' end

这似乎工作正常。 问题是当它找不到任何“/”字符时,它不会像我希望的那样用 0 填充它们。

举例说明我想执行的操作:

XXX/YYY/ZZZ/92           ---> Returns 92
XXX/YYY/ZZZ/42 (test)    ---> Returns 42
XXX YYY ZZZ 10           ---> Returns 0

所有这些都必须 "plugged" 在 select case 语句中,但这不应该改变解决方案。

提前致谢

也许 regexp_substr 适合您。如果它 returns NULL,表示未找到斜杠后跟 2 位数字和 0 个或更多字符到字符串末尾的模式,请使用 NVL() 替换为“0”。

SQL> with tbl(str) as (
      select 'XXX/YYY/ZZZ/92' from dual union
      select 'XXX/YYY/ZZZ/42 (test)' from dual union
      select 'XXX YYY ZZZ 10' from dual
    )
    select nvl(regexp_substr(str, '/(\d{2}).*$', 1, 1, NULL, 1), '0') digits
    from tbl;

DIGITS
---------------------
0
42
92

SQL>