2013-05-15 45 views
1

我目前正在嘗試重寫一個WHERE子句。如何在SQL查詢中將特殊值視爲NULL?

WHERE (ISNULL(SIDE1,'')<>'' or ISNULL(SIDE2,'')<>'') 

所以,如果SIDE1或SIDE2爲空,沒有被選中。

我想還包括評估一個字符串的WHERE子句。偶爾,SIDE1和SIDE2可以包含「其他」值。我想以與上述說明相同的方式來對待它。因此,如果SIDE1或SIDE2爲空,並且SIDE1或SIDE2包含值「other」。

在此先感謝。

+0

怎麼樣'WHERE NOT(SIDE1爲空或側面2 IS NULL)'? –

回答

1

因此,如果SIDE1或SIDE2爲空,則不會選擇任何內容。

這不是條件說的話:ORWHERE子句中意味着當SIDE1 SIDE2都是空沒有被選中;否則,其中一個<>評估爲true,使整體OR條件true也一樣。

如果你想治療'other'你對待null以同樣的方式,你可以使用in條件,像這樣:

WHERE (NOT ISNULL(SIDE1,'') IN ('', 'other')) ... 
0

你的問題不在於邏輯是如何工作是很清楚,但也許是這樣的:

WHERE 
(!ISNULL(SIDE1) OR !ISNULL(SIDE2)) 
OR 
(SIDE1 != 'other' OR SIDE2 != 'other') 

將返回該行,如果SIDE1或SIDE2的一個既不是空也不是「其他'

0

無論正在使用的數據庫管理系統,在WHERE條款使用ISNULL可能會性能下降。

所以,你只需要使用這個,如果你只擔心避免NULL值:

WHERE 
    SIDE1 IS NOT NULL AND SIDE2 IS NOT NULL. 

但後來你說你要正確對待「其他」值NULL。在這種情況下,爲什麼不這樣做呢:

WHERE 
    SIDE1 IS NOT NULL AND SIDE2 IS NOT NULL 
    AND SIDE1 <> 'other' AND SIDE2 <> 'other' 

是的,我知道。很無聊,不是嗎?沒有樂趣,當我們停止使用那些聰明的功能,如ISNULLNULLIFCOALESCE等等...

但DBMS的像納稅:我們可能更安全,當我們避免使用聰明的技巧。這很難(並且根據實際的DBMS,甚至不可能)索引功能調用。這意味着如果我們在WHERE條款上使用ISNULL,我們很可能會對我們的查詢進行全面掃描。

因此,作爲一條經驗法則,如果您可以避免在WHERE子句上使用函數調用,只需執行該操作即可。因爲它不僅對數據庫管理系統引擎更好,而且對大多數人來說也更清晰。

編輯

但是,當然,如果你真的堅持的是聰明的,一個可能的答案是

WHERE NULLIF(SIDE1, 'other') IS NOT NULL AND NULLIF(SIDE2, 'other') IS NOT NULL 

甚至

WHERE COALESCE(NULLIF(SIDE1, 'other'), NULLIF(SIDE2, 'other')) IS NOT NULL 

這將上工作Oracle和MS SQL Server數據庫(以及其他)。