为什么 null 看起来等于 WHERE 中的整数?

问题描述 投票:0回答:1

我正在使用一个简单的连接进行查询,目的是找到用户尚未投票的最新行:

SELECT
    v.user_id,
    v.version_id,
    vv.user_id
FROM versions v
LEFT JOIN versions_votes vv ON v.version_id = vv.version_id
WHERE vv.user_id != 39;

奇怪的是,如果 vv.user_id 为 null,则不会返回任何行。 我对这个问题的无可否认的平庸理解是 NULL 不能等于任何东西 - 这就是为什么我们必须测试

IS NULL
而不是
= NULL
第一名。

然而,我们到了。如果我将

WHERE
子句修改如下:

WHERE (vv.user_id != 39 OR vv.user_id IS NULL)

查询似乎工作正常(并且似乎还确认

NULL
的计算结果为 39。

sql postgresql null left-join
1个回答
5
投票

你说得对,“NULL 不能等于任何东西”
您缺少的是 NULL 也不能不相等

NULL
与任何事物相比总是
NULL
。现在的问题是你把
LEFT JOIN
弄错了。这应该有效:

SELECT v.user_id, v.version_id, vv.user_id
FROM   versions v
LEFT   JOIN versions_votes vv ON v.version_id = vv.version_id
                             AND vv.user_id = 39
WHERE  vv.version_id IS NULL
ORDER  BY v.created
LIMIT  1;

您在

vv
子句中还有一个引用
WHERE
的附加条件:
AND vv.user_id != 39
。可能期望
NULL != 39
符合条件,但事实并非如此。参见:

基本上有三种不同的技术可以做到这一点:

© www.soinside.com 2019 - 2024. All rights reserved.