次の正規表現があります。
WHERE A.srvc_call_id = '40750564' AND REGEXP_LIKE (A.SRVC_CALL_DN, '[^TEST]')
SRVC_CALL_DN
40750564を含む行の列に「TESTCALL」があり、REGEXP_LIKE
フィルターで除外されていないようです。クエリを実行すると、実行すべきでないときに行が返されます。
私の正規表現パターンは間違っていますか?またはSQLは受け入れません[^whatever]
か?
カラットは、式を文字列の先頭に固定します。文字T、E、S、Tを角かっこで囲むことにより、barsjuが文字列TESTではなく、これらの文字のいずれかを提案するように、検索します。
あなたはそれが文字列をSRVC_CALL_DN
含ん'TEST CALL'
でいると言いますが、あなたは文字列のどこにあるかを言いません。また、この文字列が一致しない場所を探しているとも言います。これはあなたが使いたいことを意味しますnot regexp_like(...
これらすべてをまとめると、次のことが必要になると思います。
AND NOT REGEXP_LIKE (A.SRVC_CALL_DN, '^TEST[[:space:]]CALL')
これにより、文字列が。で始まるクエリからすべての一致が除外されます。ただし、この文字列が列の任意の位置にある可能性がある場合は、カラットを削除する必要があります- 。 'TEST CALL'
^
これは、文字列が常に大文字であることも前提としています。大文字と小文字が混在するかそれ以下の場合は、もう一度変更する必要があります。次のようなもの:
AND NOT REGEXP_LIKE (upper(A.SRVC_CALL_DN), '^TEST[[:space:]]CALL')
大文字にSRV_CALL_DN
することで、常に一致するようにしますが、クエリでこの列のインデックスを使用しないようにします。正規表現クエリはとにかくインデックスを使用するのがかなり苦手であり、インデックスが付けられているように見えるので、この特定の点について心配する必要はありませんSRVC_CALL_ID
。
また、含まれていない可能性がある場合'CALL'
は、これを削除する必要があります。正規表現を使用して一致パターンをできるだけ明示的にする場合に最適です。可能であれば含め'CALL'
てください。
'^TEST'
またはで試してください'^TEST.*'
正規表現とは、T、E、S、Tの文字で始まらない文字列を意味します。
しかし、あなたのケースはとても単純で、TESTから始まります。次のような単純なものを使用してみませんか。
LIKE 'TEST%'