这怎么可能?
select count(*) from happiness where source = 'love';
-[ RECORD 1 ]
count | 0
select count(*) from happiness where source != 'love';
-[ RECORD 1 ]
count | 9279
select count(*) from happiness;
-[ RECORD 1 ]---
count | 1418962...
和\ d
source | character varying(255) |
当我得到这个答案时,我会非常努力地打击自己。
答案 0 :(得分:1)
SQL使用所谓的“三值”逻辑,其中给定的布尔表达式可以是“true”,“false”或“null”。对此表单的查询:
select count(*) from happiness where ...;
只返回...
为“true”的记录,跳过“false”或“null”的记录。
当source
为空时,source = 'love'
和source != 'love'
都为空;因此,您的查询的两个版本都将跳过source
为空的任何记录。 (NOT (source = 'love')
也将为空:not
“true”为“false”,not
“false”为“true”,但not
null仍为空。)
此行为的原因是null
代表“未知”;如果source
为空,那么就无法知道它是“真的”应该是'love'
,还是“真的”应该是其他东西。 (我认为我们倾向于认为null是一个独特的值,与其他值不同,但这不是它的意图。)
你可能想要的是:
select count(*) from happiness where source is null or source != 'love';
答案 1 :(得分:0)
也许这样做:
select count(*) from happiness where source is null;
如果来源为空那么来源不等于爱,而来源与爱情并无不同