我有一个查询将逗号视为字符串中的分隔符。我想要最后一次出现。
示例:字符串: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
答案 0 :(得分:3)
SELECT regexp_substr(string, '[^,]*$') FROM t
答案 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;