SQL中IS NOT NULL與 NULL的區別

2021-08-15 00:19:56 字數 1794 閱讀 2915

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

SQL中IS NOT NULL與 NULL的區別

平時經常會遇到這兩種寫法 is not null與 null。也經常會遇到資料庫有符合條件 null的資料,但是返回為空集合。實際上,是由於對二者使用區別理解不透徹。預設情況下,推薦使用 is not null去做條件判斷,因為sql預設情況下對where xx!null的判斷會永遠返回0行,卻不會...

SQL中IS NOT NULL與 NULL的區別

平時經常會遇到這兩種寫法 is not null與 null。也經常會遇到資料庫有符合條件 null的資料,但是返回為空集合。實際上,是由於對二者使用區別理解不透徹。預設情況下,推薦使用 is not null去做條件判斷,因為sql預設情況下對where xx!null的判斷會永遠返回0行,卻不會...

SQL中N 的作用

sql中n 的作用 declare sql nvarchar 4000 set sql n select totalrecords count from n sqlfullpopulate n a exec sp executesql sql,n totalrecords int output to...