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

4

当我测试一个空值在列表中时,结果总是假的,这是否符合预期。

也就是说:

 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)应该是真的。那么为什么会是假的呢?

Null是“未知”的,它可能是1 - 我们不知道。因此,我们不知道未知值是否在列表中,并将null(未知)作为结果。当您以这种方式查看它时,这是有意义的。[Postgres的实现细节。](http://stackoverflow.com/questions/19517899/not-in-in-postgresql-not-working/19528722#19528722) - Erwin Brandstetter
3个回答

8
实际上,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

1

1
由于结果未知,条件为假,因此没有任何内容被选中。 - Tim Biegeleisen

0

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

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

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

你会再次收到一个“未知”和没有记录。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接