0

我有这个字符串:

145|567

我想只提取“|”之后的部分 这个想法不使用位置,因为字符串可能有不同的长度。

Expected result:
567

非常感谢

4

4 回答 4

1

使用 instr() 获取 | 的位置 和 substr()。例如:

select substr( '123|456', instr( '123|456','|' )+1 ) from dual;

SUB
---
456
于 2017-03-17T20:12:10.237 回答
1

我想到了两种方法。第一个是正则表达式

select regexp_substr('123|456', '|([\d]+)\1') from dual

这样,您可以捕获以下任何一组数字|

另一个是带有子字符串的

select substr('123|456', instr('123|456', '|') + 1) from dual

这样你就可以从后面的位置开始提取子字符串|

于 2017-03-17T20:13:12.583 回答
0

如果您想首先在查询中解析,您需要知道在哪个位置是您需要使用的字符(如分隔符),您可以使用 INSTR 函数:

SELECT INSTR('145|567', '|') FROM dual;
-- Return 4

使用此函数,您可以获得您使用的字符串上的位置,如分隔符。

然后,您可以使用 SUBSTR 嵌套此函数,该函数可用于提取字符串的一部分:

SELECT SUBSTR('145|567', INSTR('145|567', '|') + 1) FROM dual;
-- Return 567

您需要添加一个位置,因为 INSTR 返回分隔符的确切位置,如果您不想返回 SUBSTR 操作,则传递到字符串的下一个位置。

于 2017-03-17T20:18:08.630 回答
0

只要您的解决方案处理不同长度的元素,按位置解析就没有错。此 regexp_substr 获取列表的第二个元素,其中元素后跟管道或行尾。它不关心元素的长度,并处理多个元素甚至 NULL 元素。

select regexp_substr('123|456', '(.*?)(\||$)', 1, 2, NULL, 1) from dual
于 2017-03-17T21:16:18.923 回答