IsNull 和 NullIf 雙劍合璧

2021-06-19 09:57:50 字數 2442 閱讀 4437

首先看看sql server 聯機叢書的資訊,其中我們該注意的地方我用紅字標出:

使用指定的替換值替換

null

。 語法

isnull(check_expression,replacement_value)

引數 check_expression

將被檢查是否為

null

的表示式。

check_expression

可以是任何型別的。

replacement_value

在check_expression

為null

時將返回的表示式。

replacement_value

必須與check_expresssion

具有相同的型別。

返回型別

返回與 check_expression

相同的型別

。 注釋

如果 check_expression

不為null

,那麼返回該表示式的值;否則返回

replacement_value

。 如果兩個指定的表示式相等,則返回空值。

語法 nullif(expression,expression)

引數 expression

常量、列名、函式、子查詢或算術運算子、按位運算子以及字串運算子的任意組合。

返回型別

返回型別與第乙個

expression

相同。

如果兩個表示式不相等,

nullif

返回第乙個

expression

的值。如果相等,

nullif

返回第乙個

expression

型別的空值

注釋

如果兩個表示式相等且結果表示式為

null

,nullif

等價於case

的搜尋函式

。 從以上的紅字資訊我們可以發現:

1、兩個函式的返回值都是

特定型別的,就算是空值,也是特定型別的,也就是說是特定的

資料型別和

長度(特別是字串型別的長度)的。

2、使用兩個函式的組合可以讓sql**精簡並可

替代case語句

select hopebe_0 = isnull(nullif('',''),0)

-- 返回

* --

說明:顯然這裡已經違反了

isnull

的要求了(紅字部分),

-- 且

0轉成字串的長度為1,而

''的長度為

0 select hopebe_0 = isnull(nullif(' ',' '),0) 

-- 返回

0 --

說明:這裡雖然已經違反了

isnull

的要求了(紅字部分),

-- 但是

0轉成字串的長度為1,而

' '的長度為也為

1select hopebe_empty = isnull(isnull('',''),0) 

-- 返回

'' --

說明:這個可以理解吧

select hopebe_n_0 = isnull(nullif('',''),'0000') 

-- 返回

'' --

說明:這個比較經典,請往下看

select hopebe_n_0 = isnull(nullif('x','x'),'0000') 

-- 返回

0 select hopebe_n_0 = isnull(nullif('xx','xx'),'0000') 

-- 返回

00

select hopebe_n_0 = isnull(nullif('***','***'),'0000') 

-- 返回

000select hopebe_n_0 = isnull(nullif('***x','***x'),'0000') 

-- 返回

0000

select hopebe_n_0 = isnull(nullif('***xx','***xx'),'0000') 

--返回

0000

... isnull(nullif(count(id),0),1)

--說明:這是為了防止除0和除null

Mysql的IFNULL 和NULLIF用法小結

寫在前面 ifnull ifnull 1,0 返回1 ifnull 0,1 返回0 ifnull 引數一,引數二 引數一可以為表中某欄位,若該字段為null,則就讓該字段的值為引數二的值 實際用法 1 不帶引數 可用在where條件當中用作查詢的篩選條件,where 某欄位 is null 或者 w...

isset和is null的不同

作者 laruence 今天有人問我 isset 和is null 啥區別,看手冊上講的話 isset 和is null 的功能幾乎完全 相反的一樣 是不是isset 就是乙個 is null 的相反的別名?誒,要說區別 那還真的是很多 一切的不同都是因為 is null 是函式,isset 是語句...

isset和is null的不同

作者 laruence 今天有人問我 isset 和is null 啥區別,看手冊上講的話 isset 和is null 的功能幾乎完全 相反的一樣 是不是isset 就是乙個 is null 的相反的別名?誒,要說區別 那還真的是很多 一切的不同都是因為 is null 是函式,isset 是語句...