如何在Postgres中检查字符串不等式

时间:2013-06-30 00:25:47

标签: postgresql

这怎么可能?

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

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

2 个答案:

答案 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;

如果来源为空那么来源不等于爱,而来源与爱情并无不同