3 回答

TA貢獻1848條經(jīng)驗 獲得超6個贊
在一個WHERE
子句中,column=null
永遠不會是真的,這種方式使用null是無效的,你需要說column IS NULL
或者column IS NOT NULL
。這說明了它的特殊性NULL
,它不是檢查相等性的值,它是一個未知值,所以你需要使用IS
或IS NOT
語法。
您可以NULL
使用=
相等的值分配值。例如:UPDATE TableX SET Column=NULL...

TA貢獻2041條經(jīng)驗 獲得超4個贊
“= NULL”是值的表達式現(xiàn)在,“IS NULL” 是用于評估變量條件為NULL的首選方法。
有關(guān)同一問題的更詳細討論可在以下鏈接中找到
http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/
不確定是否可以在不登錄網(wǎng)站的情況下閱讀文章,因此在此處發(fā)布相同的復制內(nèi)容
理解“IS NULL”和“= NULL”之間的區(qū)別
當使用declare語句在SQL中創(chuàng)建變量時,它將在沒有數(shù)據(jù)的情況下創(chuàng)建,并存儲在SQLs內(nèi)存空間內(nèi)的變量表(vtable)中。vtable包含變量的名稱和內(nèi)存地址。但是,當創(chuàng)建變量時,沒有為變量分配內(nèi)存地址,因此變量不是根據(jù)內(nèi)存定義的。
設(shè)置變量時,會分配一個存儲器地址,初始數(shù)據(jù)存儲在該地址中。再次設(shè)置該值時,變量指向的內(nèi)存地址中的數(shù)據(jù)將更改為新值。
現(xiàn)在為了區(qū)別,為什么每個人的行為方式都如此。
“= NULL”
“= NULL”是值的表達式。意思是,如果已設(shè)置變量并為存儲數(shù)據(jù)創(chuàng)建了內(nèi)存,則它具有值。事實上,變量可以設(shè)置為NULL,這意味著對象的數(shù)據(jù)值是未知的。如果值設(shè)置如下:
DECLARE @val CHAR(4)SET @val = NULL
您已明確將數(shù)據(jù)值設(shè)置為unknown,因此當您執(zhí)行以下操作時:
If @val = NULL
它將作為一個真實的表達來評估。
但如果我這樣做:
DECLARE @val CHAR(4)If @val = NULL
它會評估為假。
原因是我正在檢查NULL作為@val的值。由于我沒有設(shè)置@val的值,因此沒有分配內(nèi)存地址,因此@val沒有值。
注意:請參閱有關(guān)SET ANSI_NULLS(ON | OFF)的部分,因為SQL 7和2000默認值的差異會導致示例無效。這基于SQL 7。
“一片空白”
現(xiàn)在“IS NULL”有點棘手,是評估變量條件為NULL的首選方法。當您使用“IS NULL”子句時,它會檢查變量的地址和變量中的數(shù)據(jù)是否為未知。所以如果我做的話:
DECLARE @val CHAR(4)If @val IS NULL PRINT ‘TRUE’ELSE PRINT ‘FALSE’SET @val = NULLIf @val IS NULL PRINT ‘TRUE’ELSE PRINT ‘FALSE’
兩個輸出都為TRUE。原因是在第一個@val IS NULL我只聲明了變量并且沒有設(shè)置數(shù)據(jù)的地址空間,其中“IS NULL”檢查。在第二個中,值已顯式設(shè)置為NULL,“IS NULL”也檢查。
SET ANSI_NULLS(ON | OFF)
現(xiàn)在讓我在工作中拋出一個扭結(jié)。在前面的示例中,您會看到= NULL只要顯式設(shè)置值就可以工作。但是,當您設(shè)置ANSI_NULLS ON時,事情會有所不同。
防爆。
DECLARE @val CHAR(4)SET @val = NULLSET ANSI_NULLS ONIf @val =NULL PRINT ‘TRUE’ELSE PRINT ‘FALSE’SET ANSI_NULLS OFFIf @val =NULL PRINT ‘TRUE’ELSE PRINT ‘FALSE’
您將注意到在執(zhí)行SET ANSI_NULLS ON后第一次運行= NULL語句時,您得到一個FALSE,在設(shè)置為OFF后,您得到一個TRUE。原因如下。
摘自SQL BOL文章“SET ANSI_NULLS”
SQL-92標準要求等于(=)或不等于(<>)與空值的比較計算為FALSE。當SET ANSI_NULLS為ON時,即使column_name中存在空值,使用WHERE column_name = NULL的SELECT語句也會返回零行。使用WHERE column_name <> NULL的SELECT語句返回零行,即使column_name中存在非空值也是如此。
當SET ANSI_NULLS為OFF時,Equals(=)和Not Equal To(<>)比較運算符不遵循SQL-92標準。使用WHERE column_name = NULL的SELECT語句返回column_name中具有空值的行。使用WHERE column_name <> NULL的SELECT語句返回列中包含非空值的行。此外,使用WHERE column_name <> XYZ_value的SELECT語句將返回非XYZ值且不為NULL的所有行。
結(jié)束摘錄
因此,如SQL92所定義,“= NULL”應(yīng)始終評估為false。因此,即使明確設(shè)置值,也意味著如果條件和代碼可能無法正常工作,您將永遠不會滿足= NULL。= NULL的最大原因是你會在腳下射擊,SQL 7在發(fā)貨和安裝時默認為ANSI_NULL OFF,但SQL 2000默認為ANSI_NULL ON。當然你可以改變這幾種方法,但是如果你將數(shù)據(jù)庫從7升級到2000并且發(fā)現(xiàn)= NULL只有當你在推出默認的2000服務(wù)器時顯式設(shè)置時你的代碼現(xiàn)在中斷并且可能導致數(shù)據(jù)問題。
使用IS NULL的另一個原因是,根據(jù)SQL 92指南,它仍將評估為TRUE,因此您的代碼更安全地升級服務(wù)器。
摘要
如果除非您需要檢查變量的值是否設(shè)置為NULL并且您已將ANSI_NULLS設(shè)置為ON,那么總是使用“IS NULL”子句來驗證變量是否為NULL。通過使用= NULL,您可能會在嘗試解決可能由此產(chǎn)生的問題(現(xiàn)在或?qū)硪馔獾兀r遇到很多麻煩。
基礎(chǔ)
提供的一些信息來自C ++的工作原理以及SQL在每種情況下的行為方式。不幸的是,據(jù)我所知,SQL沒有一個函數(shù)地址,允許我輸出實際的內(nèi)存地址來顯示引擎蓋下發(fā)生的事情。在C ++中,當創(chuàng)建變量時,變量的地址為0xddddddd(在調(diào)試中,但它也可以是不同的非實地址)。設(shè)置變量時,第一次檢查地址將為您提供存儲數(shù)據(jù)的有效內(nèi)存地址。此外,可以從SQL Books Online的IS NULL和SET ANSI_NULLS ...部分獲取更多信息。
添加回答
舉報