为什么在WHERE中null等于整数?

时间:2014-05-12 20:23:03

标签: 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_id为null,则不会返回任何行。我不确定行人对该问题的理解是NULL 不能等于任何东西 - '这就是为什么我们必须首先测试IS NULL而不是=NULL

然而,我们在这里 - 如果我按如下方式修改WHERE子句:

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

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

1 个答案:

答案 0 :(得分:2)

你是对的NULL cannot be equal to anything 你缺少的是NULL cannot be unequal, either

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符合条件,但事实并非如此。这个相关答案的更多细节:
Query with LEFT JOIN not returning rows for count of 0

基本上三种技术可以做到这一点:
Select rows which are not present in other table