IS NOT
ではなくを使用して、この問題を回避できます!=
。このドキュメントの演算子セクションを見ると、次のことがわかります。
ISおよびISNOT演算子は、オペランドの一方または両方がNULLの場合を除いて、=および!=のように機能します。この場合、両方のオペランドがNULLの場合、IS演算子は1(true)と評価され、IS NOT演算子は0(false)と評価されます。一方のオペランドがNULLで、もう一方がNULLでない場合、IS演算子は0(false)と評価され、IS NOT演算子は1(true)と評価されます。ISまたはISNOT式がNULLと評価されることはできません。演算子ISおよびISは、=と同じ優先順位を持ちません。
私はこれを自分でテストしました:
sqlite> create table temp( dataColumn, nullColumn );
sqlite> insert into temp( dataColumn, nullColumn ) values ( 'test', NULL );
sqlite> select * from temp where nullColumn != 'test';
sqlite> select * from temp where nullColumn IS NOT 'test';
test|
sqlite> select * from temp where dataColumn IS NOT 'test';
sqlite>
もう少し遊んでみると、!=
演算子はNULL
、何かを比較するためにそれを使用するときに評価するようですNULL
:
sqlite> select ( 'contents' != NULL );
sqlite> select ( 'contents' == NULL );
sqlite> select ( 'contents' IS NULL );
0
sqlite> select ( 'contents' IS NOT NULL );
1
おそらくこれが、期待する動作が得られない理由です-WHERE NULL != 'contents'
どちらがNULLと評価され、WHERE句を満たさないかを効果的に言っています