2012-10-22 54 views
1

我剛剛寫了下面的查詢,並得到了一個驚喜(對我)結果;當我在rails中編寫查詢時,查找空值

Customer.where("satisfaction != ?","Very satisfied") 

返回的值比我預期的要少得多,原因是我的滿意度列中的數據庫爲空值。爲了得到我想要的記錄,我必須寫下面的查詢

Customer.where("satisfaction != ? or satisfaction is null","Very satisfied") 

這工作,但它的醜陋,我希望有一個更好的方法(尤其是我計劃上動態生成這些疑問,所以我想他們是儘可能簡單)。是否有一個運算符合並空值和不等值?

我的數據庫是開發中的SQLite3和生產中的Postgresql。

+0

哪個環境產生了令人驚訝的結果? – rthbound

+0

SQLite3產生了令人驚訝的結果 – brad

+2

因此,任何數據庫甚至假裝支持標準。 –

回答

5

在PostgreSQL可以使用IS DISTINCT FROM避開通常NULL的問題:

Customer.where('satisfaction is distinct from ?', 'Very satisfied') 

在SQLite的,我認爲你堅持你的明確IS NULL支票或同樣醜陋COALESCE:

Customer.where("coalesce(satisfaction, '') != ?", 'Very satisfied') 

COALESCE評估爲它的第一個非NULL參數,並且可以在SQLite和PostgreSQL中使用;你可以使用任何不符合你的'Very satisfied'而不是空字符串的東西。

我強烈建議您在PostgreSQL上部署時停止在SQLite之上進行開發。當SQLite對SQL的鬆散解釋與PostgreSQL更嚴格的解釋衝突時,你只是要求在生產服務器上有一段糟糕的時間。不要這樣做自己,使用相同的數據庫進行開發和部署(其中相同包括版本號)。

您可能還想重新訪問您的模式,以查看是否可以將NOT NULL約束添加到satisfaction列。一個明確的'Unknown'字符串可能也會起作用,並會避免通常的NULL廢話。我傾向於手動將所有內容手動默認爲NOT NULL,並且只有在允許的情況下才允許NULL。

+0

優秀建議 – rthbound

+1

我已經學會了開發和部署相同的分貝課程已經很艱難的方式。這是我目前的做法,但這是我正在重溫的一箇舊應用程序。再次感謝偉大的回答。 – brad

+0

關於我們學習任何東西的唯一方法是艱難的方式:) –