为什么null不在(1,2,3)中

时间:2015-04-13 15:43:37

标签: sql postgresql

当我测试列表中的空值不是时,结果始终为false。

那是:

 select 'Hello world' where null not in(1,2,3);

不要选择任何内容,因为(1,2,3)中的null不为false。

我不明白这一点,因为列表(1,2,3)不包含任何未定义的值(null)所以我希望null不在(1,2,3)中是真的。那么为什么这是假的?

3 个答案:

答案 0 :(得分:8)

实际上null not in (1,2,3)会返回null,而不是false,但它就像 false一个where子句一样(因为它不是true })。

空比较(a = null)等始终返回null,因为null not in (1,2,3)基本上与以下内容相同:

NOT (null = 1 OR null = 2 OR null = 3)

返回值为null。最好的办法是进行明确的空检查并单独处理这些情况。

附注:NULL in (null, 1, 2, 3)也会返回null,因为null = null会返回null

答案 1 :(得分:1)

Null始终是SQL中的一个特例。参见

http://www.postgresql.org/docs/8.3/static/functions-comparison.html

  

普通比较运算符产生null(表示"未知")   当任一输入为空时。

所以Null not In (...) will wield Null

您始终可以使用CASE WHEN来绕过此行为。见http://www.postgresql.org/docs/7.4/static/functions-conditional.html

答案 2 :(得分:0)

当您将NULL添加到布尔逻辑中时,您实际上最终会得到三个值:TRUEFALSEUNKNOWN ......

在你的where子句中,你最终会得到一个UNKNOWN,而不会将其评估为false,因此......没有记录。如果你这样做了:

WHERE NULL in (1,2,3,NULL)

你会再次得到一个未知的'没有记录。

换句话说,NULL不是可以评估的值,它更像是记录的状态。