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

时间:2014-11-12 02:34:50

标签: sql oracle split substring delimiter

我有一个字符串,我想在某个位置用分隔符拆分该字符串。

例如,我的字符串是F/P/O,我要找的结果是:

Screenshot of desired result

因此,我想用最远的分隔符分隔字符串 注意:我的一些字符串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

结果是:

Screenshot of unexpected result

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:29)

  

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

我知道这是一个老问题,但这是一个简单的要求, 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

如你所说,你想要最远分隔符,它将意味着反向的第一个分隔符。

你的方法很好,但你错过了 INSTR 中的 start_position 。如果start_position为否定,则INSTR函数会对字符串末尾的start_position字符数进行计数,然后搜索字符串的开头。

答案 1 :(得分:17)

您想使用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
顺便说一句,

Here是SQL Fiddle。

糟糕。我错过了它所说的 last 分隔符的部分问题。为此,我们可以使用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

here就是这个对应的SQL Fiddle。