Postgresql和一个空字段比较
看来在PostgreSQL中,empty_field != 1
(或其他值)是FALSE。如果这是真的,有人可以告诉我如何比较空的领域?Postgresql和一个空字段比较
我有下面的查询,翻译过来就是“选择用户组中的所有职位,其中一个尚未投票:
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从 与<>运算符相同。 但是,当两个输入都为空时,它将返回false,并且只有一个 输入为空时,它将返回true。
如果您想返回v.user_id为NULL的行,那么您需要特别处理该行。你能解决这个问题的方法之一是写:
AND COALESCE(v.user_id, 0) != 1
另一种选择是:
AND (v.user_id != 1 OR v.user_id IS NULL)
编辑:spacemonkey是正确的,在PostgreSQL里你应该在这里使用IS DISTINCT FROM
。
它似乎是DISTINCT FROM太工作了 – spacemonkey 2010-11-08 18:50:10
@spacemonkey:你说得对。这实际上是PostgreSQL中更好的方法。我完全忽略了它。 – 2010-11-08 19:00:08
NULL是一个未知值,所以它永远不会等于某件事。看看使用COALESCE函数。
可能与各种其他问题重复,例如http://*.com/q/1833949/141081,http://*.com/q/3777230/141081,... – Dirk 2010-11-08 18:40:41