MySQL中case?when對NULL值判斷的踩坑記錄
前言
今天在開發(fā)程序中,從MySQL中提取數(shù)據(jù)的時候,使用到了case when的語法用來做判斷,在使用過程中在判斷NULL值的時候遇到個小問題
sql中的case when 有點類似于Java中的switch語句,比較靈活,但是在Mysql中對于Null的處理有點特殊
Mysql中case when語法:
語法1:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
語法2:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
注意:? 這兩種語法是有區(qū)別的,區(qū)別如下:
1:第一種語法:case_value必須是一個表達式,例如 userid%2=1或者username is null等。該種語法不能用于測試NULL。
2:第二種語法CASE后面不需要變量或者表達式,直接執(zhí)行時候評估每一個WHEN后面的條件,如果滿足則執(zhí)行。
案例實戰(zhàn):
表結(jié)構(gòu)如下:a 值為null, b值為1
mysql> SELECT NULL AS a, 1 AS b; +------+---+ | a | b | +------+---+ | NULL | 1 | +------+---+
現(xiàn)在實現(xiàn),如果a值為null 則取b值,否則取a值
方法1: ifnull 用法
SELECT
IFNULL(a, b) AS new,
a,
b
FROM
-- 創(chuàng)建臨時表: a 的值為null ,b為1
(SELECT NULL AS a, 1 AS b) tmp;
方法2: case when 用法
SELECT
(
CASE a
WHEN a IS NULL THEN
b
ELSE
a
END
) AS new,
a,
b
FROM
(SELECT NULL AS a, 1 AS b) tmp;
發(fā)現(xiàn)得到的結(jié)果不對,new 的值居然為null ,而不是我們想要的1.
為什么會出現(xiàn)這個錯誤呢?是將第一種語法與第二種語法混用導(dǎo)致的,case 后面commission_pct 的值有兩種:真實值或者為null,而 when 后面的commission_pct is null 也有兩個值:true或者false,所以case 后面為null時候永遠無法跟true或false匹配,因此輸出不為null。
對于該種情況如果必須要用語法1的話可以如下改寫:
SELECT
(
CASE a IS NULL
WHEN TRUE THEN b
ELSE a
END
) AS new,
a,
b
FROM
(SELECT NULL AS a, 1 AS b) tmp;
也可以使用語法2寫:
SELECT
(
CASE
WHEN a is NULL THEN b
ELSE a
END
) AS new,
a,
b
FROM
(SELECT NULL AS a, 1 AS b) tmp;
注意另一種可能存在錯誤卻不容易發(fā)現(xiàn)錯誤的情況:
SELECT
(
CASE a
WHEN NULL THEN b
ELSE a
END
) AS new,
a,
b
FROM
(SELECT NULL AS a, 1 AS b) tmp;
看似沒有問題,實際有問題,問題原因就是null的判斷不能用=進行判斷。簡單說就是:語法1中的case表達式的值與后面的when的值使用的=進行判等,但是mysql中必須使用is 或者is not。
總結(jié):
1:語法1是將case后面的表達式值計算好之后跟后面的when條件的值使用“=”進行判斷相等,相等就進入該分支。
2:語法2是不需要case后面有表達式,直接評估when后面的條件值即可,如果為true則進入。
到此這篇關(guān)于MySQL中case?when對NULL值判斷的文章就介紹到這了,更多相關(guān)MySQL?case?when對NULL值判斷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 5.7升級8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總
MySQL 5.7.34 升級到 8.0.32 后部分查詢語句報錯如下,ERROR 1267 (HY000),比較操作中使用不同的字符集或排序規(guī)則通常會觸發(fā)此問題,所以本文給大家介紹了MySQL 5.7升級8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總,需要的朋友可以參考下2024-06-06
為什么MySQL選擇Repeatable Read作為默認隔離級別
關(guān)于MySQL的事務(wù)隔離級別,相信很多讀者都不陌生,那么,你知道為什么Oracle選擇RC作為默認級別,而MySQL要選擇RR作為默認的隔離級別嗎2021-07-07
Centos 7 安裝mysql5.7.24二進制 版本的方法及解決辦法
這篇文章主要介紹了Centos 7 安裝mysql5.7.24二進制 版本的方法 及遇到問題解決辦法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11
MySQL數(shù)據(jù)庫實驗實現(xiàn)簡單數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計
這篇文章主要介紹了MySQL數(shù)據(jù)庫實驗實現(xiàn)簡單數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計,文章通過理解并能運用數(shù)據(jù)庫設(shè)計的常見步驟來設(shè)計滿足給定需求的概念模和關(guān)系數(shù)據(jù)模型展開詳情,需要的朋友可以參考一下2022-06-06
Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句)
這篇文章主要介紹了Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
詳解MySql自連接,外連接,內(nèi)連接?,左連接,右連接
這篇文章主要介紹了詳解MySql自連接,外連接,內(nèi)連接?,左連接,右連接,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08

