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>
我正在寻找一种方法来始终检索字符串中最后一个“/”字符之后的 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>