2

这怎么可能?

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)      | 

当我得到这个问题的答案时,我会非常努力地打自己的脸。

4

2 回答 2

2

SQL 使用所谓的“三值”逻辑,由此给定的布尔表达式可以是“真”、“假”或“空”。这种形式的查询:

select count(*) from happiness where ...;

只会返回...“true”的记录,跳过“false”或“null”的记录。

何时source为空,source = 'love'source != 'love'均为空;因此,您的查询的两个版本都将跳过任何source为空的记录。(NOT (source = 'love')也将为 null:not“true”为“false”,not“false”为“true”,但notnull 仍然为 null。)

这种行为的原因是null表示“未知”;如果source为空,则无法知道它是“真的”应该是'love',还是“真的”应该是其他东西。(我认为我们倾向于将 null 视为一个独特的值,与所有其他值不同,但这不是它的预期含义。)

你可能想要的是:

select count(*) from happiness where source is null or source != 'love';
于 2013-06-30T00:31:59.497 回答
0

也许这样做:

select count(*) from happiness where source is null;

如果源为空,则源不等于爱,但源与爱没有区别

于 2013-06-30T00:31:35.650 回答