Sql 为什么null等于WHERE中的整数?

Sql 为什么null等于WHERE中的整数?,sql,postgresql,null,left-join,Sql,Postgresql,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 WHERE vv.user_id != 39; 奇怪的是,如果vv.user\u id为null,则不会返回任何行。我对这个问题的理解是null不能等于任何东西-这就

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

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\u id为null,则不会返回任何行。我对这个问题的理解是null不能等于任何东西-这就是为什么我们必须首先测试
是否为null
,而不是
=null

然而,如果我修改WHERE条款如下:

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

查询似乎工作正常(并且似乎确认
NULL
的计算结果为39。

您认为
NULL不能等于任何值是正确的

你缺少的是那一点

NULL
与任何东西相比,总是
NULL
。当前的问题是
左连接错误。这应该可以:

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;
您在
WHERE
子句中有一个引用
vv
的附加条件:
和vv.user\u id!=39
。可能希望
NULL!=39
符合条件,但不符合条件。此相关答案中的更多详细信息:

基本上有三种方法可以做到这一点:

状态
和创建的
来自哪里?请澄清并(始终)这个问题可以提供一些洞察力:一个操作符为null的底线使表达式评估为Falsii认为鲍伯在这里得到了正确的结果——因为我正在做一个=比较,它会以他建议的方式对一个null作出反应,这是我没有考虑的。d
来自
版本,但不相关-正如我所说,如果我通过或测试空值,则查询的行为与预期一致。@sudowned:每一列的来源总是相关的。即使这些列似乎与您无关。这需要在问题中明确。@wildplasser:确实如此。可能是三值逻辑c毕竟不是一个好主意。但缺点是:人们会实施他们自己的系统。很糟糕。和/或因此没有实施它。