2012-07-05 67 views
0

在包含Toppings值爲「巧克力」的五個記錄的表中,其中兩個在MaraschinoCherry列中的值爲「是」,另外三個在該列中不包含任何內容(不是「否」 - 無/空)。什麼時候或爲什麼是等於不是在SQL查詢中不等於相反?

此查詢工作正常:

select definition from desserts 
where (Toppings = 'Chocolate') and 
     (MaraschinoCherry <> 'Yes') 
order by id 

...返回預期三個記錄;但這一個什麼也沒有返回,而不是我期望的兩個記錄:

select definition from desserts 
where (Toppings = 'Chocolate') and 
     (MaraschinoCherry = 'Yes') 
order by id 

???

+0

仔細檢查具有值'是'的記錄。也許周圍有一些空間?嘗試使用'LIKE'%Yes%''運行相同的查詢以確保相同。 – xbonez 2012-07-05 17:27:08

+0

你確定2有'是'而'有'還是更糟?嘗試修剪。 – banging 2012-07-05 17:27:29

+0

MaraschinoCherry的數據類型是什麼?如果它只是是/否,你應該使它成爲一個布爾值,並且存儲TRUE或FALSE。 – Sablefoste 2012-07-05 17:28:20

回答

3

您的問題的答案很簡單。任何與NULL值的比較(有兩個例外)都會導致NULL。所以,

MaraschinoCherry = 'Yes' 

MaraschinoCherry <> 'Yes' 

當MaraschinoCherry有NULL值都返回NULL。 NULL比較被視爲與FALSE相同。

兩個例外是:IS NULL和IS NOT NULL。注意「= NULL」總是返回NULL,它被解釋爲FALSE。

正常的方式來解決,這是通過使用COALESCE:

COALESCE(MaraschinoCherry, 'NO') = 'Yes' 

(函數ISNULL()是一種等價的,但是COALESCE允許更多的參數,是標準的SQL。)

有其他方法可以解決這個問題,例如在定義表格時指定列的默認值,通過將明確的比較添加到NULL,將列聲明爲「NOT NULL」或在某些數據庫中重寫行爲在違反SQL標準的比較中爲NULL(高度推薦!)。

+0

我錯過了一些東西...如果'MaraschinoCherry'是'Yes'或'null',那麼第一個查詢找不到任何東西 - 因爲你描述的空比較行爲,'null''是'是假的 - 第二個查找兩條記錄。你如何從第一到第三從第二到第三? – 2012-07-05 18:43:29

相關問題