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 に答える