使用oracle SQL按分隔符位置拆分String

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

因此,我想用最远的分隔符分隔字符串.

我知道这是一个老问题,但这是一个简单的要求,SUBSTRINSTR就足够了.与旧的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_POSITIONINSTR.如果start_position为负数,则该INSTR函数将从字符串末尾开始计算start_position字符数,然后搜索字符串的开头.

  • 简单更好:substr 和 instr 比 'regexp_substr' 简单 (2认同)

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小提琴.