当我测试列表中的空值不是时,结果始终为false。
那是:
select 'Hello world' where null not in(1,2,3);
不要选择任何内容,因为(1,2,3)中的null不为false。
我不明白这一点,因为列表(1,2,3)不包含任何未定义的值(null)所以我希望null不在(1,2,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
添加到布尔逻辑中时,您实际上最终会得到三个值:TRUE
,FALSE
和UNKNOWN
......
在你的where子句中,你最终会得到一个UNKNOWN
,而不会将其评估为false,因此......没有记录。如果你这样做了:
WHERE NULL in (1,2,3,NULL)
你会再次得到一个未知的'没有记录。
换句话说,NULL
不是可以评估的值,它更像是记录的状态。