我有一个SQL查询像
SELECT * FROM tableName WHERE colName != 'contents'
现在相反的是我预计今年似乎并不匹配COLNAME在认为其内容是“NULL”。 望着SQLite的是如何处理空值和specifially这种情况下"null OR true" is true
存在的SqlLite真的,我wouldve想到我的查询wouldve已经sufficent与选择的行NULL
的colName
。 我mustve错误地理解这一点。 任何人都可以提供一些线索这对我来说? 我可以只使用
SELECT * FROM tableName WHERE (colName != 'contents' OR colName IS NULL)
但我没想到我会得。
谢谢
您可以通过使用解决这个问题IS NOT
而不是!=
。 如果你看一下这个文件的运营商部分 ,你会看到:
该IS和IS NOT运营商合作像=和!=除非操作数的一方或双方为NULL。 在这种情况下,如果两个操作数都为NULL,则操作者IS的计算结果为1(真)和IS NOT操作者的计算结果为0(假)。 如果一个操作数为NULL,另一种是不,那么IS运算结果为0(假)和IS NOT操作是1(真)。 这是不可能的一个是或不是表达式计算为NULL。 运营商是并且不是具有相同的优先级=。
我测试了这一点自己:
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子句