亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是“= null”和“IS NULL”

什么是“= null”和“IS NULL”

月關寶盒 2019-08-28 10:28:57
什么是“= null”和“IS NULL”“= null”和“IS NULL”有什么區別?他們如何使用不同的方式?
查看完整描述

3 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

在一個WHERE子句中,column=null永遠不會是真的,這種方式使用null是無效的,你需要說column IS NULL或者column IS NOT NULL。這說明了它的特殊性NULL,它不是檢查相等性的值,它是一個未知值,所以你需要使用ISIS NOT語法。

您可以NULL使用=相等的值分配值。例如:UPDATE TableX SET Column=NULL...


查看完整回答
反對 回復 2019-08-28
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

“= NULL”是值的表達式現在,“IS NULL” 是用于評估變量條件為NULL的首選方法。

有關同一問題的更詳細討論可在以下鏈接中找到

http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/

不確定是否可以在不登錄網站的情況下閱讀文章,因此在此處發布相同的復制內容

理解“IS NULL”和“= NULL”之間的區別

當使用declare語句在SQL中創建變量時,它將在沒有數據的情況下創建,并存儲在SQLs內存空間內的變量表(vtable)中。vtable包含變量的名稱和內存地址。但是,當創建變量時,沒有為變量分配內存地址,因此變量不是根據內存定義的。

設置變量時,會分配一個存儲器地址,初始數據存儲在該地址中。再次設置該值時,變量指向的內存地址中的數據將更改為新值。

現在為了區別,為什么每個人的行為方式都如此。

“= NULL”

“= NULL”是值的表達式。意思是,如果已設置變量并為存儲數據創建了內存,則它具有值。事實上,變量可以設置為NULL,這意味著對象的數據值是未知的。如果值設置如下:

DECLARE @val CHAR(4)SET @val = NULL

您已明確將數據值設置為unknown,因此當您執行以下操作時:

If @val = NULL

它將作為一個真實的表達來評估。

但如果我這樣做:

DECLARE @val CHAR(4)If @val =  NULL

它會評估為假。

原因是我正在檢查NULL作為@val的值。由于我沒有設置@val的值,因此沒有分配內存地址,因此@val沒有值。

注意:請參閱有關SET ANSI_NULLS(ON | OFF)的部分,因為SQL 7和2000默認值的差異會導致示例無效。這基于SQL 7。

“一片空白”

現在“IS NULL”有點棘手,是評估變量條件為NULL的首選方法。當您使用“IS NULL”子句時,它會檢查變量的地址和變量中的數據是否為未知。所以如果我做的話:

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我只聲明了變量并且沒有設置數據的地址空間,其中“IS NULL”檢查。在第二個中,值已顯式設置為NULL,“IS NULL”也檢查。

SET ANSI_NULLS(ON | OFF)

現在讓我在工作中拋出一個扭結。在前面的示例中,您會看到= NULL只要顯式設置值就可以工作。但是,當您設置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’

您將注意到在執行SET ANSI_NULLS ON后第一次運行= NULL語句時,您得到一個FALSE,在設置為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的所有行。

結束摘錄

因此,如SQL92所定義,“= NULL”應始終評估為false。因此,即使明確設置值,也意味著如果條件和代碼可能無法正常工作,您將永遠不會滿足= NULL。= NULL的最大原因是你會在腳下射擊,SQL 7在發貨和安裝時默認為ANSI_NULL OFF,但SQL 2000默認為ANSI_NULL ON。當然你可以改變這幾種方法,但是如果你將數據庫從7升級到2000并且發現= NULL只有當你在推出默認的2000服務器時顯式設置時你的代碼現在中斷并且可能導致數據問題。

使用IS NULL的另一個原因是,根據SQL 92指南,它仍將評估為TRUE,因此您的代碼更安全地升級服務器。

摘要

如果除非您需要檢查變量的值是否設置為NULL并且您已將ANSI_NULLS設置為ON,那么總是使用“IS NULL”子句來驗證變量是否為NULL。通過使用= NULL,您可能會在嘗試解決可能由此產生的問題(現在或將來意外地)時遇到很多麻煩。

基礎

提供的一些信息來自C ++的工作原理以及SQL在每種情況下的行為方式。不幸的是,據我所知,SQL沒有一個函數地址,允許我輸出實際的內存地址來顯示引擎蓋下發生的事情。在C ++中,當創建變量時,變量的地址為0xddddddd(在調試中,但它也可以是不同的非實地址)。設置變量時,第一次檢查地址將為您提供存儲數據的有效內存地址。此外,可以從SQL Books Online的IS NULL和SET ANSI_NULLS ...部分獲取更多信息。


查看完整回答
反對 回復 2019-08-28
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

= NULL用于賦值給NULL值,而IS NULL用于確定變量是否為NULL值。

sssignment為NULL的示例:

Update TableName Set ColumnName = NULL

與條件子句(鏈接)中的NULL值進行比較的示例:

Select * From TableName Where ColumnName is NULL

ColumnName IS NOT Null 也可用于確保值為非NULL。


查看完整回答
反對 回復 2019-08-28
  • 3 回答
  • 0 關注
  • 1214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號