2010-11-08 76 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函數。