2014-04-01 22 views
-1

我有這個疑問與空回報比較int值零記錄

Declare @value int 
Select 21 where 1 <> @value 

我得到0的結果。

這怎麼說是有道理的。 1不能等於零!

+3

你的意思是'選擇21,其中1不爲空' –

+0

爲了使這個聲音儘可能禪。 n不會將值與未知值進行比較。 – Zane

+0

要展開,「NULL」是一個不是值的狀態。如果你不知道某人的姓名,當你被問到他們應該在哪裏按字母順序排列時,你會說什麼? – JNK

回答

2

NULL必須按以下方式處理,

等於null:

Column IS NULL 

不等於空:

Column IS NOT NULL 

或者:

ISNULL(Column,-1) = -1 
ISNULL(Column,-1) <> -1 
+2

如果值爲NULL,則將coulmn值設置爲-1,然後如果列的真實值爲-1,則與-1比較將創建不可預測的行爲。 該答案的第一部分是正確的,但不推薦第二部分。 –

+0

是的,如果確實存在-1值,我不會使用它。它完全是一個如何用NON NULL來處理NULLS的例子 –

+2

在數據庫中處理數據的一件事告訴我,應該永遠不要依賴數據來滿足您的期望。預計它是完全錯誤的,並且根據涵蓋每種可能性的標準進行防禦性編碼,並且最終結果將是基於應用程序中先前代碼中的錯誤所產生的錯誤數據而不易出現錯誤和行爲的更健壯的解決方案。 –

1

NULL是未知的標記,它不是一個值 - 意味着它可以是任何值,包括1,因此您的查詢返回0記錄。以下查詢將返回記錄。

select 21 where 1 is not null 
0

您應該考慮ANSI_NULLs,根據設置的方式您將得到不同的結果。

當ANSI_NULLS設置爲ON

SET ANSI_NULLS ON 
GO 

IF (NULL=NULL) 
    PRINT 'EQUAL' 
ELSE 
    PRINT 'NOT EQUAL' 
GO 

結果:不等於

當ANSI_NULLS設置爲OFF(NULL = NULL(;)

SET ANSI_NULLS OFF 
GO 

IF (NULL=NULL) 
    PRINT 'EQUAL' 
ELSE 
    PRINT 'NOT EQUAL' 
GO 

結果:EQUAL