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

Posted

技术标签:

【中文标题】使用oracle SQL按分隔符位置拆分字符串【英文标题】:Split String by delimiter position using oracle SQL 【发布时间】:2015-01-08 19:01:32 【问题描述】:

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

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

结果是:

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

【问题讨论】:

【参考方案1】:

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

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

正如您所说,您想要 最远 分隔符,这意味着 reverse 的第一个分隔符。

您的方法很好,但是您缺少 INSTR 中的 start_position。如果 start_position 为负数INSTR 函数从字符串末尾开始倒数 start_position 个字符,然后向字符串开头搜索。

【讨论】:

简单更好:substr和instr比'regexp_substr'简单【参考方案2】:

您想为此使用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。

【讨论】:

当我发表关于更简单的评论(见下文)时,我遇到了一个不简单的情况。谢谢 Gordon Linoff 和 Lalit Kumar B。

以上是关于使用oracle SQL按分隔符位置拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQL拆分逗号分隔的字符串

SQL拆分逗号分隔的字符串

使用正则表达式在Oracle中按分隔符拆分字符串

使用 regexp_substr 在 Oracle 中按空格和字符拆分字符串作为分隔符

使用 Oracle SQL 将可变长度分隔字符串拆分为列

获取字符串,按分隔符拆分并插入到 Oracle 中的表过程 [重复]