我目前正在嘗試重寫一個WHERE子句。如何在SQL查詢中將特殊值視爲NULL?
WHERE (ISNULL(SIDE1,'')<>'' or ISNULL(SIDE2,'')<>'')
所以,如果SIDE1或SIDE2爲空,沒有被選中。
我想還包括評估一個字符串的WHERE子句。偶爾,SIDE1和SIDE2可以包含「其他」值。我想以與上述說明相同的方式來對待它。因此,如果SIDE1或SIDE2爲空,並且SIDE1或SIDE2包含值「other」。
在此先感謝。
我目前正在嘗試重寫一個WHERE子句。如何在SQL查詢中將特殊值視爲NULL?
WHERE (ISNULL(SIDE1,'')<>'' or ISNULL(SIDE2,'')<>'')
所以,如果SIDE1或SIDE2爲空,沒有被選中。
我想還包括評估一個字符串的WHERE子句。偶爾,SIDE1和SIDE2可以包含「其他」值。我想以與上述說明相同的方式來對待它。因此,如果SIDE1或SIDE2爲空,並且SIDE1或SIDE2包含值「other」。
在此先感謝。
因此,如果SIDE1或SIDE2爲空,則不會選擇任何內容。
這不是條件說的話:OR
的WHERE
子句中意味着當SIDE1 和 SIDE2都是空沒有被選中;否則,其中一個<>
評估爲true
,使整體OR
條件true
也一樣。
如果你想治療'other'
你對待null
以同樣的方式,你可以使用in
條件,像這樣:
WHERE (NOT ISNULL(SIDE1,'') IN ('', 'other')) ...
你的問題不在於邏輯是如何工作是很清楚,但也許是這樣的:
WHERE
(!ISNULL(SIDE1) OR !ISNULL(SIDE2))
OR
(SIDE1 != 'other' OR SIDE2 != 'other')
將返回該行,如果SIDE1或SIDE2的一個既不是空也不是「其他'
無論正在使用的數據庫管理系統,在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'
是的,我知道。很無聊,不是嗎?沒有樂趣,當我們停止使用那些聰明的功能,如ISNULL
,NULLIF
,COALESCE
等等...
但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數據庫(以及其他)。
怎麼樣'WHERE NOT(SIDE1爲空或側面2 IS NULL)'? –