regexp_substr:正则表达式,用于提取逗号分隔的字符串文字

时间:2015-01-09 16:39:42

标签: sql regex oracle regexp-substr

以下正则表达式分隔逗号分隔的普通值

(SELECT regexp_substr(:pCsv,'[^,]+', 1, level) 
 FROM DUAL 
 CONNECT BY regexp_substr(:pCsv, '[^,]+', 1, level) IS NOT NULL);

示例:

300100033146068, 300100033146071 , 300100033146079

返回

300100033146068
300100033146071
300100033146079

如果我们使用带有SQL IN运算符的正则表达式

,这可以正常工作
select * 
from mytable 
where t.mycolumn IN (SELECT regexp_substr(:pCsv,'[^,]+', 1, level) 
                     FROM DUAL 
                     CONNECT BY regexp_substr(:pCsv, '[^,]+', 1, level) IS NOT NULL);

但如果逗号分隔值是单引号字符串文字

,则此查询无效
'one' , ' two' , 'three'

1 个答案:

答案 0 :(得分:2)

作为评论中提到的sln,您的正则表达式匹配任意数量的非,字符。这意味着它将匹配'one',而不是您期望的one

要排除单引号和空格,您需要将它们添加到排除字符列表中。

您的新内部查询应如下所示:

SELECT regexp_substr(:pCsv,'[^,'' ]+', 1, level)
FROM DUAL
CONNECT BY regexp_substr(:pCsv, '[^,'' ]+', 1, level) IS NOT NULL

请注意,我们必须使用''来表示单引号,因为它出现在另一个字符串中。