2011-10-29 32 views
2

我正在解決更大的問題,但已將其縮小到此,以便使此問題更容易提出。SQL其中Column1 = Column1將只返回非空值

下面的查詢:

Select * from User where Country = Country 

將只返回行,其中國家不爲空。我期望如果Column1爲空,它會返回它,因爲NULL = NULL。

任何意見,爲什麼這不工作,我期望的任何輸入?

編輯:

我試圖做到這一點:

Select * from User where Country = coalesce(@Country, Country) 

如果我的變量@Country是空的,我想它拉一切。

回答

5

SQL使用three valued logictruefalseunknown)和比較,以NULL(除了與運營商IS [NOT] NULL測試)評價爲unknowntrue只要session選項ANSI_NULLS上。

對於要從您的查詢中返回的行,WHERE子句需要評估爲true

按照你的編輯,你可以使用

Select * 
from User 
where @Country is null or Country = @Country 
option (recompile) 

要在@country is null返回所有行。雖然可能更好,但只要將它們分解爲2個案例以避免重新編譯處罰。

IF @Country is null 
Select * 
from User 
ELSE 
Select * 
from User 
Where Country = @Country 
1

NULL是永遠等於NULL,所以當國家爲空,鄉村!=國家

您使用IS運算符測試NULL的。

如果你真的想NULLS(我真的不明白,爲什麼你; d希望在第一時間這樣的查詢),然後嘗試..

select * from User where IFNULL(Country, '') = IFNULL(Country, '')

select * from User where Country = Country or Country IS NULL

+1

正確,NULL不等於NULL,因爲兩者都未定義,因此無法評估兩者的相等性。 –

+0

「NULL永遠不等於NULL」 - 不正確。提示:「GROUP BY」和「ORDER BY」。 – onedaywhen

+0

@onedaywhen:你在'distinct'(定義在SQL:2003 3.1.6.8')和'equal'(在SQL:2003 3.1.6.13'中定義)混淆。這些是'SQL'中的不同概念,'GROUP BY'組''不明確'值。 – Quassnoi

相關問題