1

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

(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'
4

1 回答 1

2

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

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

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

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

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

于 2015-01-09T17:07:26.183 回答