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

來源:互聯網
上載者:User

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

平時經常會遇到這兩種寫法: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、Null 字元串、空格都不同。
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”。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.