为什么在WHERE中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_id为空。我承认我对这个问题的一般理解是NULL 不能等于任何东西-这就是为什么我们必须首先测试IS NULL而不是=NULL

然而,我们在这里-如果我像这样修改WHERE子句:

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

查询似乎工作正常(并且似乎也确认NULL正在评估为39.

你是对的, 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;

WHERE子句中有一个引用vv的附加条件:AND vv.user_id != 39。可能期望NULL != 39符合条件,但它没有。看到:

  • 查询左连接不返回计数为0的行

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

  • 选择其他表
  • 中不存在的行

最新更新