REGEXP_SUBSTR 负数

REGEXP_SUBSTR with negative position

我有一个将逗号视为字符串中的分隔符的查询。我想 substr 最后一次出现。

示例:字符串:a、b、c、d 字符串:e、f、g、h、i、j

select regexp_substr(string, '[^,]+', -1, 1)
from dual;

应该return:d和j

但是报错提示-1位置超出范围

Oracle 文档:https://docs.oracle.com/cd/E11882_01/olap.112/e23381/row_functions063.htm#OLAXS456

SELECT regexp_substr(string, '[^,]*$') FROM t

Test

没有正则表达式的解决方案可能是:

select substr(string, instr( string, ',', -1)+1)
from yourTable

在这里您使用 instr 查找最后一次出现的 ','(如果有),然后使用 substr 仅 return 输入字符串的所需部分.

您可以通过以下几种方式完成此操作:

WITH sample_data AS (SELECT 'a, b, c, d' str FROM dual UNION ALL
                     SELECT 'e, f, g, h, i, j' str FROM dual UNION ALL
                     SELECT 'e, f, g, h, i, jk' str FROM dual UNION ALL
                     SELECT 'e,f,g,h,i,jk' str FROM dual UNION ALL
                     SELECT 'e,f,g,h,i,' str FROM dual UNION ALL
                     SELECT 'e, f, g, h, i,' str FROM dual)
SELECT str,
       ltrim(SUBSTR(str, INSTR(str, ',', -1, 1) + 1)) last_item1,
       regexp_substr(str, '.*, ?([^,]*$)', 1, 1, NULL, 1) last_item3
FROM   sample_data;

STR               LAST_ITEM1        LAST_ITEM3
----------------- ----------------- -----------------
a, b, c, d        d                 d
e, f, g, h, i, j  j                 j
e, f, g, h, i, jk jk                jk
e,f,g,h,i,jk      jk                jk
e,f,g,h,i,                          
e, f, g, h, i,                      

这是两个选项之间的一个 toss-up 关于哪个选项在您的系统中性能最高 and/or 可维护的问题 - 您需要对此进行测试。

上面的 regexp_substr 解决方案检查任何字符的模式(换行符除外),然后是逗号,然后是 space(或不是),最后是任何不是的字符到字符串末尾的逗号。然后我们输出第一个子表达式(由模式的括号部分定义)。

我在 substr/instr 项目中加入了 ltrim 因为你说你的分隔符是逗号,但它看起来可能是逗号+space.

你在评论中问如果你想获得第二次出现怎么办?第 4 个参数是您想要 return 的元素。此格式处理 NULL 元素:

with tbl(str) as (
  select 'a, b, c, d' from dual union
  select 'e,,g,h,i,j' from dual
)
select regexp_substr(str, '(.*?)(,|$)', 1, 2, NULL, 1) element
from tbl;