您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“MySQL中case when對NULL值判斷的踩坑分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
在開發(fā)程序中,從MySQL中提取數(shù)據(jù)的時候,使用到了case when的語法用來做判斷,在使用過程中在判斷NULL值的時候遇到個小問題
sql中的case when 有點類似于Java中的switch語句,比較靈活,但是在Mysql中對于Null的處理有點特殊
語法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í)行。
表結(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。
“MySQL中case when對NULL值判斷的踩坑分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。