空的SQLite的处理(SQLite handling of NULL)

2019-06-24 22:00发布

我有一个SQL查询像

SELECT * FROM tableName WHERE colName != 'contents'

现在相反的是我预计今年似乎并不匹配COLNAME在认为其内容是“NULL”。 望着SQLite的是如何处理空值和specifially这种情况下"null OR true" is true存在的SqlLite真的,我wouldve想到我的查询wouldve已经sufficent与选择的行NULLcolName 。 我mustve错误地理解这一点。 任何人都可以提供一些线索这对我来说? 我可以只使用

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

但我没想到我会得。

谢谢

Answer 1:

您可以通过使用解决这个问题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子句



文章来源: SQLite handling of NULL
标签: sqlite null