NULL的SQLite处理
我有一个SQL查询,比如NULL的SQLite处理,sqlite,null,Sqlite,Null,我有一个SQL查询,比如 SELECT * FROM tableName WHERE colName != 'contents' 现在,与我所期望的相反,这似乎与内容为“NULL”的colName不匹配。查看并明确说明此条件“null或true”对于SqlLite为true我认为我的查询足以为colName选择具有null的行。我一定理解错了。有人能帮我解释一下吗?我可以用 SELECT * FROM tableName WHERE (colName != 'contents' OR colN
SELECT * FROM tableName WHERE colName != 'contents'
现在,与我所期望的相反,这似乎与内容为“NULL”的colName不匹配。查看并明确说明此条件“null或true”对于SqlLite为true
我认为我的查询足以为colName
选择具有null
的行。我一定理解错了。有人能帮我解释一下吗?我可以用
SELECT * FROM tableName WHERE (colName != 'contents' OR colName IS NULL)
但我不认为我必须这么做
谢谢您可以使用
而不是来绕过这个问题=代码>。如果你看一下,你会看到:
“是”和“不是”操作符的工作方式类似于=和!=除非一个或两个操作数都为空。在这种情况下,如果两个操作数都为NULL,则IS运算符的计算结果为1(true),而IS NOT运算符的计算结果为0(false)。如果一个操作数为NULL,另一个为非NULL,则is运算符的计算结果为0(false),而is not运算符的计算结果为1(true)is或not表达式的计算结果不可能为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>
从更多的游戏来看,似乎=当您使用code>运算符与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!='内容“
,其计算结果为NULL,并且不满足WHERE子句+1。我认为没有什么东西可以添加到该答案中,使其更好。