2013-02-14 31 views
0

我在找一個SQLite WHERE子句,這將給我的記錄,如果它們是:SQLite的布爾WHERE檢查0和NULL值

0 (false) 
NULL (false) 
1 (true) 

因此,除了0和1我也有NULL記錄。

我現在在做一個

SELECT * FROM my_table WHERE (MyBoolean IS NULL OR MyBoolean = 0) AND SomeOtherValue NOT NULL; 

當使用

SELECT * FROM my_table WHERE NOT MyBoolean AND SomeOtherValue NOT NULL; 

值= NULL記錄都沒有找到,只值= 0記錄:O(

我是不是要把我的列作爲一個布爾值嗎?

回答

1

在這裏鑄造不會有幫助(CAST (null AS sometype)仍然是NULL)任何你可以使用的東西或多或少會與你現在使用的表達式相當:我發現WHERE NOT COALESCE(MyBoolean,0)更具可讀性,但這是個人偏好。

+0

謝謝安東。我認爲我是最好的嘗試防止NULL值。 – pxp 2013-02-14 12:50:19

+0

SELECT * FROM my_table WHERE MyBoolean!= 1; 這隻給我0值記錄。我怎樣才能得到NULL記錄呢? – pxp 2013-02-14 13:09:16

+1

'NULL!=任何東西'總是'NULL',所以去'COALESCE'。 (我可以預先說'NOT(MyBoolean = 1)'也沒有幫助,因爲NULL = nothing是NULL,NOT(NULL)是NULL。 – 2013-02-14 13:10:49

1

處理NULL布爾值確實非常棘手。

我不知道你的代碼的架構任何東西,但要儘量考慮以下幾點:

讓您MyBooleanNOT NULL DEFAULT TRUE(或FALSE,依賴)。

它可能需要輕微的代碼重構,但它會保持所有的SELECT清潔,可讀,並且可以避免使用hacky方法。

我會重複一遍自己:如果您的架構非常不靈活,並且您無法完成這種重構,此解決方案可能無法正常工作。

希望這可以幫助任何人。