2014-01-19 70 views
1

請您澄清一下SQL Server中的ColumnName = NullColumnName Is Null之間的區別。我已經搜索了這個,但我不明白。ColumnName = Null和ColumnName之間的差異在SQL Server中爲空

其實我想檢索列具有空值

Select * from Table1 where column1 is null 

該查詢返回預期的結果,但是下面的查詢不給

Select * from Table1 where column1 = null 

是這些查詢之間的區別。

+0

可能的重複[爲什麼SQL不支持「= null」而不是「爲空」?](http://stackoverflow.com/questions/7078837/why-doesnt-sql-support-null-instead-的,是空的)。你還應該檢查[爲什麼SQL不支持「= null」而不是「is null」?](http://stackoverflow.com/questions/7078837/why-doesnt-sql-support-null-instead-of- is-null) – MarcinJuraszek

回答

3

的空值比較。

這基本上是因爲null是「未知的」,所以無法確定它是否是某個值。

必須使用特殊語法is nullis not null來確定無效。

+1

除ANSI_NULLS爲OFF時外。注意:ANSI_NULLS OFF已棄用,並且將在未來版本的SQL Server中刪除。 –

-2

「is null」是正確的方法。這就像<>和!=之間的差異不相等。 !=是標準。

這裏是微軟的文檔:http://technet.microsoft.com/en-us/library/ms188795.aspx

「要確定一個表達式是否爲NULL,使用IS NULL或IS NOT NULL而不是比較運算符(如=或!=)比較運算符返回UNKNOWN當任。或者兩個參數都是NULL。「

+2

不正確。兩者都不起作用! (除非ANSI NULLS從默認設置更改) –

+0

沒有第二個查詢給出結果 –

2

NULL使用comparison運營商將導致聯合國Unkown result

看看下面的例子:

Declare @temp table 
(
val1 int, 
val2 int 
) 

INSERT INTO @temp 
VALUES (1,NULL), 
     (NULL,1), 
     (NULL,NULL) 

SELECT CASE 
     WHEN val1 > val2 THEN 'Val 1 greater' 
     WHEN val2 > val1 THEN 'val 1 smaller' 
     WHEN val1 = val2 THEN 'Val1 is equal to val 2' 
     WHEN val1 = NULL THEN 'val1 = NULL' 
     WHEN val1 IS NULL THEN 'val1 IS NULL' 
     ELSE 'Unknown' 
     END result 
FROM @temp 

這將導致:

Unknown 
val1 IS NULL 
val1 IS NULL 

請注意,改變ANSI_NULLSOFF,將改變=運營商的行爲,並且將返回TRUENULL = NULL

任何方式,恕我直言(我認爲普遍的看法是),最好的做法是使用正常的運營商都從未真正使用IS NULL

相關問題