REGEXP_SUBSTR负面位置

时间:2017-02-17 15:06:44

标签: oracle regexp-substr

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

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

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

应该返回:d和j

但错误消息显示-1位置超出范围。

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

4 个答案:

答案 0 :(得分:3)

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

Test

答案 1 :(得分:2)

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

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

在这里,您使用instr查找最后一个',',如果有的话,然后substr只返回输入字符串所需的部分。

答案 2 :(得分:2)

您可以通过以下几种方式实现目标:

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,                      

两个选项之间的关系是关于哪个选项在您的系统中性能最高和/或可维护 - 您需要对此进行测试。

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

我在subtr / instr项中包含了ltrim,因为你说你的分隔符是一个逗号,但看起来它可能是一个逗号+空格。

答案 3 :(得分:1)

你在评论中询问如果你想要第二次出现?第四个参数是您要返回的元素。此格式处理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;