使用Oracle SQL按分隔符位置拆分字符串

48

我有一个字符串,希望按照某个位置的分隔符将其拆分。

例如,我的字符串是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

结果是:

意外结果的屏幕截图

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

2个回答

53

因此,我希望通过最远的分隔符来分离字符串。

我知道这是一个老问题,但对于这个简单的要求,SUBSTRINSTR 就已足够。相比之下,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

如您所说,您想要最< strong>远的定界符,这意味着从< strong>反向的第一个定界符开始。

您的方法不错,但是在< strong>INSTR中缺少< strong>start_position。 如果< strong>start_position为< strong>负数,则< code>INSTR 函数从字符串末尾向前计算start_position个字符,然后向字符串开头搜索。


4
简单就是更好:使用substr和instr比起'regexp_substr'更简单。 - glenn garson

38
你想使用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

这里是 SQL Fiddle。

哎呀,我漏掉了问题中提到的最后一个分隔符。对于这个问题,我们可以使用 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

这里是相应的SQL Fiddle。点击链接


我刚刚评论了更简单的事情,就遇到了一个不简单的情况。非常感谢Gordon Linoff和Lalit Kumar B. - glenn garson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接