SQLite对NULL的处理方式

4

我有一条类似的SQL查询语句:

SELECT * FROM tableName WHERE colName != 'contents'

与我的预期相反,这似乎不匹配内容为“NULL”的colName。查看SQLite处理NULL的方式,特别是这个条件"null OR true" is true对于SqlLite而言是true,我原以为我的查询已足以选择具有NULLcolName行。我一定误解了这个问题。有人能够为我阐述一下吗?我可以只使用

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

但我没有想到我必须这样做。
谢谢。
1个回答

5
您可以使用 IS NOT 而不是 != 来解决此问题。如果您查看文档的运算符部分,您会发现:

IS 和 IS NOT 运算符的工作方式类似于 = 和 !=,除非其中一个或两个操作数为 NULL。在这种情况下,如果两个操作数都为 NULL,则 IS 运算符的结果为 1(true),而 IS NOT 运算符则为 0(false)。如果一个操作数为 NULL,另一个操作数不为 NULL,则 IS 运算符的结果为 0(false),而 IS NOT 运算符的结果为 1(true)。IS 或 IS NOT 表达式不可能评估为 NULL。运算符 IS 和 IS NOT 的优先级与 = 相同。

我亲自测试了一下:

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子句。

+1 我认为我无法为那个答案添加任何东西使其更好。 - Donal Fellows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接