当我测试一个空值不在列表中时,结果总是假的,这是否符合预期。
也就是说:
select 'Hello world' where null not in(1,2,3);
不要选择任何内容,因为null not in(1,2,3)是假的。我不理解这个,因为列表(1,2,3)中没有包含任何未定义的值(null),所以我期望null not in(1,2,3)应该是真的。那么为什么会是假的呢?
当我测试一个空值不在列表中时,结果总是假的,这是否符合预期。
也就是说:
select 'Hello world' where null not in(1,2,3);
null not in (1,2,3)
返回的是null
而不是false
,但它在where
子句中的作用类似于false
(因为它不是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
。在SQL中,NULL始终是一个特殊情况。请参见
http://www.postgresql.org/docs/8.3/static/functions-comparison.html
当输入任意一个参数为null时,普通的比较运算符会返回null(表示“未知”)。
因此,null not in (...)
会返回 null。
您可以始终使用 CASE WHEN 来避免这种行为。请参见 http://www.postgresql.org/docs/7.4/static/functions-conditional.html。
当您将NULL
添加到布尔逻辑中时,实际上可能会得到三个值:TRUE
、FALSE
和UNKNOWN
...
在您的where子句中,您最终得到一个UNKNOWN
,而没有评估为false,因此...没有记录。如果您这样做:
WHERE NULL in (1,2,3,NULL)
你会再次收到一个“未知”和没有记录。
换句话说,NULL
不是一个可以评估的值,它更像是一条记录的状态。
1
- 我们不知道。因此,我们不知道未知值是否在列表中,并将null(未知)作为结果。当您以这种方式查看它时,这是有意义的。[Postgres的实现细节。](http://stackoverflow.com/questions/19517899/not-in-in-postgresql-not-working/19528722#19528722) - Erwin Brandstetter