Avi*_*mar 25 sql oracle split substring delimiter
我有一个字符串,我想通过分隔符在某个位置拆分该字符串.
例如,我的字符串是F/P/O
,我正在寻找的结果是:
因此,我想用最远的分隔符分隔字符串.
注意:我的一些字符串F/O
也适用于我的SQL下面的工作正常并返回所需的结果.
我写的SQL如下:
SELECT Substr('F/P/O', 1, Instr('F/P/O', '/') - 1) part1,
Substr('F/P/O', Instr('F/P/O', '/') + 1) part2
FROM dual
Run Code Online (Sandbox Code Playgroud)
结果是:
为什么会发生这种情况,我该如何解决?
Lal*_*r B 30
因此,我想用最远的分隔符分隔字符串.
我知道这是一个老问题,但这是一个简单的要求,SUBSTR和INSTR就足够了.与旧的subtsr和instr函数相比,REGEXP仍然是较慢且CPU密集型的操作.
SQL> WITH DATA AS
2 ( SELECT 'F/P/O' str FROM dual
3 )
4 SELECT SUBSTR(str, 1, Instr(str, '/', -1, 1) -1) part1,
5 SUBSTR(str, Instr(str, '/', -1, 1) +1) part2
6 FROM DATA
7 /
PART1 PART2
----- -----
F/P O
Run Code Online (Sandbox Code Playgroud)
正如你所说,你想要最远的分隔符,它将意味着从反面开始的第一个分隔符.
你的做法是好的,但你缺少START_POSITION在INSTR.如果start_position为负数,则该INSTR
函数将从字符串末尾开始计算start_position字符数,然后搜索字符串的开头.
Gor*_*off 19
你想用regexp_substr()
它.这适用于您的示例:
select regexp_substr(val, '[^/]+/[^/]+', 1, 1) as part1,
regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t
Run Code Online (Sandbox Code Playgroud)
在这里,顺便说一句,是SQL小提琴.
哎呀.我错过了问题的最后一个分隔符的部分.为此,我们可以使用regex_replace()
第一部分:
select regexp_replace(val, '/[^/]+$', '', 1, 1) as part1,
regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t
Run Code Online (Sandbox Code Playgroud)
而这里是此对应的SQL小提琴.