【发布时间】:2023-03-19 01:43:01
【问题描述】:
我正在使用普通连接进行查询,目的是找到用户尚未投票的最新记录:
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。
【问题讨论】:
-
status和created来自哪里?请澄清并(始终)添加您的 Postgres 版本。 -
这个问题可能会提供一些见解:stackoverflow.com/questions/5658457/… 底线
其中一个运算符为 NULL 使表达式评估为 FALSE -
我认为 Bob 在这里得到了它 - 因为我正在做一个 != 比较,它会以他建议的方式对一侧的 NULL 做出反应,我没有考虑到这一点。
-
status和created来自versions,但不相关 - 正如我所说,如果我通过 OR 测试 NULL,则查询的行为符合预期。 -
@sudowned:每一列的来源总是相关。即使这些列似乎与您无关。这需要在问题中明确。
标签: sql postgresql null left-join