MySQL中的case?when中對(duì)于NULL值判斷的坑及解決
case when 中對(duì)于NULL值判斷的坑
sql中的case when 有點(diǎn)類似于Java中的switch語(yǔ)句,比較靈活,但是在Mysql中對(duì)于Null的處理有點(diǎn)特殊;
Mysql中case when語(yǔ)法
語(yǔ)法1:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
語(yǔ)法2:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
注意: 這兩種語(yǔ)法是有區(qū)別的,區(qū)別如下:
1:第一種語(yǔ)法:case_value必須是一個(gè)表達(dá)式,例如 userid%2=1或者username is null等。該種語(yǔ)法不能用于測(cè)試NULL。
2:第二種語(yǔ)法CASE后面不需要變量或者表達(dá)式,直接執(zhí)行時(shí)候評(píng)估每一個(gè)WHEN后面的條件,如果滿足則執(zhí)行。
案例實(shí)戰(zhàn)
表結(jié)構(gòu)如下:a 值為null, b值為1
mysql> SELECT NULL AS a, 1 AS b; +------+---+ | a | b | +------+---+ | NULL | 1 | +------+---+
現(xiàn)在實(shí)現(xiàn),如果a值為null 則取b值,否則取a值
方法1:ifnull 用法
SELECT IFNULL(a, b) AS new, a, b FROM
創(chuàng)建臨時(shí)表: 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é)果不對(duì),new 的值居然為null ,而不是我們想要的1.
為什么會(huì)出現(xiàn)這個(gè)錯(cuò)誤呢?是將第一種語(yǔ)法與第二種語(yǔ)法混用導(dǎo)致的,case 后面commission_pct 的值有兩種:真實(shí)值或者為null,而 when 后面的commission_pct is null 也有兩個(gè)值:true或者false,所以case 后面為null時(shí)候永遠(yuǎn)無(wú)法跟true或false匹配,因此輸出不為null。
對(duì)于該種情況如果必須要用語(yǔ)法1的話可以如下改寫(xiě):
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;
也可以使用語(yǔ)法2寫(xiě):
SELECT ( CASE WHEN a is NULL THEN b ELSE a END ) AS new, a, b FROM (SELECT NULL AS a, 1 AS b) tmp;
注意另一種可能存在錯(cuò)誤卻不容易發(fā)現(xiàn)錯(cuò)誤的情況:
SELECT ( CASE a WHEN NULL THEN b ELSE a END ) AS new, a, b FROM (SELECT NULL AS a, 1 AS b) tmp;
看似沒(méi)有問(wèn)題,實(shí)際有問(wèn)題,問(wèn)題原因就是null的判斷不能用=進(jìn)行判斷。
簡(jiǎn)單說(shuō)就是:
語(yǔ)法1中的case表達(dá)式的值與后面的when的值使用的=進(jìn)行判等,但是mysql中必須使用is 或者is not。
總結(jié)
1:語(yǔ)法1是將case后面的表達(dá)式值計(jì)算好之后跟后面的when條件的值使用“=”進(jìn)行判斷相等,相等就進(jìn)入該分支。
2:語(yǔ)法2是不需要case后面有表達(dá)式,直接評(píng)估when后面的條件值即可,如果為true則進(jìn)入。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL中空值和NULL的區(qū)別小結(jié)
- MySQL默認(rèn)值(DEFAULT)和非空約束(NOT NULL)的實(shí)現(xiàn)
- MySQL中NULLIF?、IFNULL、IF的用法和區(qū)別舉例詳解
- MySQL語(yǔ)句之條件語(yǔ)句IFNULL和COALESCE的區(qū)別說(shuō)明
- mysql ifnull不起作用原因分析以及解決
- 檢查MySQL中的列是否為空或Null的常用方法
- mysql?count()函數(shù)不計(jì)算null和空值問(wèn)題
- mysql的case when字段為空,null的問(wèn)題
- mysql?count?為null時(shí),顯示0的問(wèn)題
- MySQL?5.7中NULL與‘?‘空字符值的多維度分析(詳解)
相關(guān)文章
利用mysql事務(wù)特性實(shí)現(xiàn)并發(fā)安全的自增ID示例
項(xiàng)目中經(jīng)常會(huì)用到自增id,比如uid,下面為大家介紹下利用mysql事務(wù)特性實(shí)現(xiàn)并發(fā)安全的自增ID,感興趣的朋友可以參考下2013-11-11
mysql如何將sql查詢的結(jié)果以百分比展示出來(lái)
這篇文章主要給大家介紹了關(guān)于mysql如何將sql查詢的結(jié)果以百分比展示出來(lái)的相關(guān)資料,用到了MySQL字符串處理中的兩個(gè)函數(shù)concat()和left()實(shí)現(xiàn)查詢結(jié)果以百分比顯示,需要的朋友可以參考下2023-08-08
Mysql8.0壓縮包安裝方法(詳細(xì)教程一步步安裝)
這篇文章主要給大家介紹了關(guān)于Mysql8.0壓縮包安裝方法,文中介紹的非常詳細(xì),Mysql安裝的時(shí)候可以有msi安裝和zip解壓縮兩種安裝方式,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程
這篇文章主要介紹了Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程,需要的朋友可以參考下2018-03-03
關(guān)于加強(qiáng)MYSQL安全的幾點(diǎn)建議
現(xiàn)在php+mysql組合越來(lái)越多,這里腳本之家小編就為大家分享一下mysql的安裝設(shè)置的幾個(gè)小技巧2016-04-04
解讀MySQL中一個(gè)B+樹(shù)能存儲(chǔ)多少數(shù)據(jù)
這篇文章主要介紹了解讀MySQL中一個(gè)B+樹(shù)能存儲(chǔ)多少數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
mysql修改數(shù)據(jù)庫(kù)引擎的幾種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于mysql修改數(shù)據(jù)庫(kù)引擎的相關(guān)資料,包括使用ALTERTABLE語(yǔ)句、更改默認(rèn)存儲(chǔ)引擎、使用MySQLWorkbench、導(dǎo)出和導(dǎo)入數(shù)據(jù)以及編寫(xiě)腳本批量修改,每種方法都有其優(yōu)缺點(diǎn)和適用場(chǎng)景,需要的朋友可以參考下2024-11-11
Can’t open file:''[Table]mytable.MYI''
也許很多人遇到過(guò)類似Can’t open file: ‘[Table]mytable.MYI’ 這樣的錯(cuò)誤信息,卻不知道怎么解決他,下面我們做個(gè)介紹,2011-01-01

