2010-11-08 43 views
6

看来在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。

+0

可能与各种其他问题重复,例如http://stackoverflow.com/q/1833949/141081,http://stackoverflow.com/q/3777230/141081,... – Dirk 2010-11-08 18:40:41

回答

4

如果您想返回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

+0

它似乎是DISTINCT FROM太工作了 – spacemonkey 2010-11-08 18:50:10

+1

@spacemonkey:你说得对。这实际上是PostgreSQL中更好的方法。我完全忽略了它。 – 2010-11-08 19:00:08

1

NULL是一个未知值,所以它永远不会等于某件事。看看使用COALESCE函数。