web-dev-qa-db-ja.com

SQL Not Likeステートメントが機能しない

ストアドプロシージャ内に次のコードがあります。

WHERE
    WPP.ACCEPTED = 1 AND
    WPI.EMAIL LIKE '%@MATH.UCLA.EDU%' AND
    (WPP.SPEAKER = 0 OR
    WPP.SPEAKER IS NULL) AND
    WPP.COMMENT NOT LIKE '%CORE%' AND
    WPP.PROGRAMCODE = 'cmaws3'

NOT LIKEステートメントは機能しません。そして、誰かが何かを言う前に、COREを含まないCOMMENT列を持つアイテムがあり、他のすべての列は問題ありません。

誰がこれの何が悪いのか知っていますか?

39
mattgcon

WPP.COMMENTNULLが含まれている場合、条件は一致しません。

このクエリ:

SELECT  1
WHERE   NULL NOT LIKE '%test%'

何も返しません。

NULL列では、任意の検索文字列に対してLIKENOT LIKEの両方がNULLを返します。

あなたの意見では返されるべきであるがそうではない行の関連する値を投稿してください。

56
Quassnoi

これに出くわすと、答えは簡単です。ISNULLを使用します。テキスト比較検索を行うときに、テストしているフィールドに(一部のレコードで)値がない場合、SQLは行を返しません。例:

WHERE wpp.comment NOT LIKE '%CORE%'

したがって、nullコマンドを使用して、一時的にISNULL(空の)レコードの値を置き換えました。たとえば、

WHERE (ISNULL(wpp.comment,'')) NOT LIKE '%CORE%'

これにより、nullを持つすべてのレコードが表示され、一致する基準を持つレコードはすべて除外されます。必要に応じて、覚えやすいようにコンマに何かを入れることができます。例えば

WHERE (ISNULL(wpp.comment,'some_records_have_no_value')) NOT LIKE '%CORE%'
7

特定のCOMMENT列の値はヌルですか?

NOT LIKEは、nullの周囲で適切に動作する方法を知らない場合があります。

6
James Cronen

私はちょうど同じ問題に出くわし、それを解決しましたが、この投稿を見つける前ではありませんでした。そして、あなたの質問が本当に答えられなかったのを見て、ここに私の解決策があります(うまくいけば、あなたまたは私と同じことを探している他の人のために働くでしょう;

の代わりに;

... AND WPP.COMMENT NOT LIKE '%CORE%' ...

試してみてください。

... AND NOT WPP.COMMENT LIKE '%CORE%' ...

基本的に、私が評価していたフィールドの反対側に「NOT」を移動することはうまくいきました。

4
Valiante

mattgcon、

動作するはずです。「NOT LIKE」行をコメントアウトして同じSQLを実行すると、行が増えますか?そうでない場合は、データを確認してください。あなたの質問であなたが言及したことは知っていますが、実際のSQL文がその句を使用していることを確認してください。 NULLを使用した他の回答もお勧めです。

1
Mark Kadlec