2013-03-21 59 views
0

所以我知道MySQL的說:有沒有辦法查詢mysql中所有不在集合中的記錄,即使它是空的?

一般來說,含有NULL值和空表表是在編寫子查詢,總是考慮是否採取了這兩種可能性考慮「邊緣情況。」 http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html

但是這沒有意義。如果我說:

select * from users where users.id NOT IN (NULL);

不應該返回所有用戶嗎?即使通過自己的邏輯說:

NOT IN是<> ALL的別名。因此,這兩個語句是相同的:

對我而言,返回所有記錄其中id不等於NULL,這是所有記錄。

所以問題是,我怎樣才能實現選擇不在特定集合中的所有記錄,即使該集合爲空

顯然,在我的應用程序代碼(Rails應用程序)中,我可以檢查該集是否爲空並修改我的查詢,但這看起來很荒謬。有什麼辦法可以在sql中完成這一切嗎?

回答

2

假設NULL是或有一個值的常見錯誤 - 在這種情況下,您假設NULL = empty set

NULL意味着不確定的 - 所以在所有RDMS NULL = NULLNULLNULL <> NULLNULLAnything = NULL就是Anything <> NULL就是NULL。 RDMS中的NULL與數學中零除相同。

這就是爲什麼您必須使用特殊比較運算符IS NULL而不是=

查詢結構化,因此可翻譯爲select * from users where users.id NOT IN (undefined)。並且users.id NOT IN (undefined)本身是undefined

我假設您的查詢中的NULL來自Rails中的變量 - 我將其稱爲pnl(可能爲空列表)。所以這個查詢會給你你想要的。

select * from users where users.id NOT IN (pnl) OR pnl IS NULL; 
+0

很好的答案!感謝您的解釋!對我來說,簡單的解決方法是將空數組加入逗號分隔的字符串中 – 2013-03-21 05:13:54

相關問題