佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > SQL中IS NOT NULL與!=NULL的區(qū)別

SQL中IS NOT NULL與!=NULL的區(qū)別

熱門標(biāo)簽:百度競(jìng)價(jià)排名 Linux服務(wù)器 鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化 服務(wù)外包 地方門戶網(wǎng)站 AI電銷 呼叫中心市場(chǎng)需求

平時(shí)經(jīng)常會(huì)遇到這兩種寫法:IS NOT NULL與!=NULL。也經(jīng)常會(huì)遇到數(shù)據(jù)庫(kù)有符合條件!=NULL的數(shù)據(jù),但是返回為空集合。實(shí)際上,是由于對(duì)二者使用區(qū)別理解不透徹。

默認(rèn)情況下,推薦使用 IS NOT NULL去做條件判斷,因?yàn)镾QL默認(rèn)情況下對(duì)WHERE XX!= Null的判斷會(huì)永遠(yuǎn)返回0行,卻不會(huì)提示語(yǔ)法錯(cuò)誤。

這是為什么呢?

SQL Server文檔中對(duì)Null值的比較運(yùn)算定義了兩種規(guī)則,如在SQL Server 2000中:

規(guī)則一是是ANSISQL(SQL-92)規(guī)定的Null值的比較取值結(jié)果都為False,既Null=Null取值也是False。另一種不準(zhǔn)循ANSISQL標(biāo)準(zhǔn),即Null=Null為True。:

例如數(shù)據(jù)表test結(jié)構(gòu):

復(fù)制代碼 代碼如下:

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

按照ANSI SQL標(biāo)準(zhǔn),下面的兩個(gè)查詢都不返回任何行:

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

而按照非ANSI SQL標(biāo)準(zhǔn),查詢1將返回第二行,查詢2返回1、3行。

這是因?yàn)樵赟QL中,NULL是一種特有的數(shù)據(jù)類型,其等價(jià)于沒有任何值、是未知數(shù)。NULL與0、空字符串、空格都不同。
ANSI SQL標(biāo)準(zhǔn)中取得Null值的行需要用下面的查詢:

復(fù)制代碼 代碼如下:

SELECT * FROM test WHERE data IS NULL

由此可見非ANSI SQL標(biāo)準(zhǔn)中data=NULL等同于data IS NULL,data>NULL等同于data IS NOT NULL。

所以我們要牢記:默認(rèn)情況下做比較條件時(shí)使用關(guān)鍵字“is null”和“is not null”。

如果你一定要使用!= null來(lái)進(jìn)行條件判斷,需要加上這個(gè)命令語(yǔ)句:SET ANSI_NULLS OFF,這時(shí)數(shù)據(jù)庫(kù)進(jìn)入ANSI SQL非標(biāo)準(zhǔn)模式,你會(huì)發(fā)現(xiàn)IS NOT NULL 和 != null 是等效的了。

這里使用的是模式切換命令SET ANSI_NULLS[ON/OFF]。ON值采用ANSI SQL嚴(yán)格標(biāo)準(zhǔn),OFF值采用非標(biāo)準(zhǔn)兼容模式。另外SET ANSI_DEFAULTS [ON/OFF]命令也可以實(shí)現(xiàn)標(biāo)準(zhǔn)的切換,只是這個(gè)命令控制的是一組符合SQL-92標(biāo)準(zhǔn)的設(shè)置,其中就包括Null值的標(biāo)準(zhǔn)。

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

例如下面這種情況:你的應(yīng)用程序使用ADODB來(lái)訪問數(shù)據(jù)庫(kù),采用OleDb或者ODBC數(shù)據(jù)提供程序。對(duì)于查詢一: SELECT * FROM test WHERE data=NULL
我們可以直接發(fā)送命令取得查詢結(jié)果集,也可把它放到存儲(chǔ)過程當(dāng)中。但二者查詢結(jié)果不同。若直接使用查詢命令,不返回任何行;而如果訪問存儲(chǔ)過程,返回第2行的數(shù)據(jù)。

最后,我們?cè)俅温暶鳎簲?shù)據(jù)庫(kù)默認(rèn)情況下,做SQL條件查詢比較時(shí)使用關(guān)鍵字“is null”和“is not null”。

標(biāo)簽:蘭州 仙桃 湘潭 湖南 黃山 衡水 崇左 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL中IS NOT NULL與!=NULL的區(qū)別》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    桑日县| 镇远县| 金沙县| 普陀区| 陆河县| 鸡东县| 分宜县| 双鸭山市| 昌都县| 锡林浩特市| 灌南县| 延寿县| 田林县| 婺源县| 道孚县| 民乐县| 凤山县| 黎城县| 天水市| 凤翔县| 双柏县| 长海县| 安福县| 渝中区| 依安县| 德兴市| 乐平市| 泰来县| 桦南县| 浠水县| 泽州县| 吴川市| 蒙城县| 类乌齐县| 长葛市| 林芝县| 洱源县| 武清区| 白银市| 三河市| 湟源县|