程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> SQL中IS NOT NULL與!=NULL的區別

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”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved