SQL中IS NOT NULL與!=NULL的區別


平時經常會遇到這兩種寫法:IS NOT NULL與!=NULL。也經常會遇到數據庫有符合條件!=NULL的數據,但是返回為空集合。實際上,是由於對二者使用區別理解不透徹。

默認情況下,推薦使用 IS NOT NULL去做條件判斷,因為SQL默認情況下對WHERE XX!= Null的判斷會永遠返回0行,卻不會提示語法錯誤。

這是為什么呢?

SQL Server文檔中對Null值的比較運算定義了兩種規則,如在SQL Server 2000中:

規則一是是ANSISQL(SQL-92)規定的Null值的比較取值結果都為False,既Null=Null取值也是False。另一種不准循ANSISQL標准,即Null=Null為True。:

例如數據表test結構:

復制代碼代碼如下:

ROWNUM     DATA
-------------------
1     'Liu Yang'
2     Null
3     '12345'


按照ANSI SQL標准,下面的兩個查詢都不返回任何行:

 

查詢一: SELECT * FROM test WHERE data=NULL
查詢二: SELECT * FROM test WHERE data<>NULL

而按照非ANSI SQL標准,查詢1將返回第二行,查詢2返回1、3行。

這是因為在SQL中,NULL是一種特有的數據類型,其等價於沒有任何值、是未知數。NULL與0、空字符串、空格都不同。
ANSI SQL標准中取得Null值的行需要用下面的查詢:

復制代碼代碼如下:

SELECT * FROM test WHERE data IS NULL


由此可見非ANSI SQL標准中data=NULL等同於data IS NULL,data<>NULL等同於data IS NOT NULL。

 

所以我們要牢記:默認情況下做比較條件時使用關鍵字“is null”和“is not null”。

如果你一定要使用!= null來進行條件判斷,需要加上這個命令語句:SET ANSI_NULLS OFF,這時數據庫進入ANSI SQL非標准模式,你會發現IS NOT NULL 和 != null 是等效的了。

這里使用的是模式切換命令SET ANSI_NULLS[ON/OFF]。ON值采用ANSI SQL嚴格標准,OFF值采用非標准兼容模式。另外SET ANSI_DEFAULTS [ON/OFF]命令也可以實現標准的切換,只是這個命令控制的是一組符合SQL-92標准的設置,其中就包括Null值的標准。

默認情況下,數據庫管理程序(DB-Library)是SET ANSI_NULLS為OFF的。但是我們的大多數應用程序,都是通過ODBC或者OLEDB來訪問數據庫的,作為一種開放兼容的數據庫訪問程序,或許是兼容性的考慮,SETANSI_NULLS值設置為ON。這樣一來帶來的一些問題是需要注意的。像存儲過程或者自定義函數這樣的應用程序都是基於DB-Library的,默認情況下,SETANSI_NULLS為OFF,並且在這樣的程序中,不能使用SETANSI_NULLS在一個環境中修改規則,只能修改數據庫配置參數。

例如下面這種情況:你的應用程序使用ADODB來訪問數據庫,采用OleDb或者ODBC數據提供程序。對於查詢一: SELECT * FROM test WHERE data=NULL
我們可以直接發送命令取得查詢結果集,也可把它放到存儲過程當中。但二者查詢結果不同。若直接使用查詢命令,不返回任何行;而如果訪問存儲過程,返回第2行的數據。

最后,我們再次聲明:數據庫默認情況下,做SQL條件查詢比較時使用關鍵字“is null”和“is not null”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM