4

次のようなSQLクエリがあります

SELECT * FROM tableName WHERE colName != 'contents'

予想に反して、これは内容が「NULL」である colName と一致しないようです。SQLite が NULLを処理する方法と、具体的にはこの条件がSqlLite"null OR true" is trueに当てはまることを見て、クエリでNULLforを使用して行を選択するのに十分だと思ったでしょうcolName。私はこれを間違って理解したに違いありません。誰かが私のためにこれに光を当てることができますか? 私はちょうど使用することができます

SELECT * FROM tableName WHERE (colName != 'contents' OR colName IS NULL)

しかし、そうしなければならないとは思いませんでした。

ありがとう

4

1 に答える 1

5

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句を満たさないかを効果的に言っています

于 2012-05-29T12:11:17.033 に答える