平時經常會遇到這兩種寫法: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”。