Postgresql与空字段的比较

7
在PostgreSQL中,似乎empty_field != 1(或其他值)为FALSE。如果是这样的话,有人能告诉我如何与空字段进行比较吗?
我有以下查询,它的意思是“选择用户组中所有尚未投票的帖子:
SELECT p.id, p.body, p.author_id, p.created_at
FROM posts p
LEFT OUTER JOIN votes v ON v.post_id = p.id
WHERE p.group_id = 1 
AND v.user_id != 1

并且它没有输出任何内容,即使投票表是空的。也许我的查询有问题,而不是上面的逻辑有问题?
编辑:看起来将v.user_id != 1更改为v.user_id IS DISTINCT FROM 1就可以了。 来自PostgreSQL文档:
对于非空输入,IS DISTINCT FROM与<>运算符相同。但是,当两个输入都为空时,它将返回false,并且当只有一个输入为空时,它将返回true。

可能与其他问题重复,例如https://dev59.com/AHI-5IYBdhLWcg3weoTR,https://dev59.com/GW865IYBdhLWcg3whO7E等。 - Dirk
2个回答

5

如果你想返回v.user_id为空的行,那么你需要特别处理。你可以这样修复它:

AND COALESCE(v.user_id, 0) != 1

另一种选择是:
AND (v.user_id != 1 OR v.user_id IS NULL)

编辑:spacemonkey的意见是正确的,在PostgreSQL中,应该使用IS DISTINCT FROM


似乎 IS DISTINCT FROM 也完成了工作。 - spacemonkey
1
@spacemonkey:你说得对。在PostgreSQL中,这实际上是更好的方法。我完全忽视了它。 - Mark Byers

2

NULL是一个未知的值,因此它永远不能等于任何东西。建议使用COALESCE函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接