MySQL中的case when then end中對於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

注意:  這兩種語法是有區別的,區別如下:

1:第一種語法:case_value必須是一個表達式,例如 userid%2=1或者username is null等。該種語法不能用於測試NULL。

2:第二種語法CASE後面不需要變量或者表達式,直接執行時候評估每一個WHEN後面的條件,如果滿足則執行。

 

使用場景1:

對每一個用戶ID進行奇偶數顯示:

SELECT  employee_id , case employee_id when employee_id%2=1 then "奇數編號" else "偶數編號" end  "奇偶編號"   FROM employees;

 

使用場景2:

判斷某一字段是否爲空,如果爲空的話則輸出漢字爲空,不爲空輸出不爲空。

SELECT
	 (case commission_pct WHEN commission_pct is null THEN "commission_pct爲null" else "commission_pct不爲null" end)  ,commission_pct,
	department_id
FROM
	employees;

爲什麼會出現這個錯誤呢?是將第一種語法與第二種語法混用導致的,case 後面commission_pct 的值有兩種:真實值或者爲null,而 when 後面的commission_pct is null 也有兩個值:true或者false,所以case 後面爲null時候永遠無法跟true或false匹配,因此輸出不爲null。

對於該種情況如果必須要用語法1的話可以如下改寫:

SELECT  (case  commission_pct IS NULL  WHEN true THEN "lala" else commission_pct end) AS "new_col" ,   commission_pct 
from  employees;

也可以使用語法2寫:

SELECT  (case  WHEN commission_pct IS NULL THEN "commission_pct爲null" else "commission_pct不爲null" end) AS "是否爲空" ,   commission_pct 
from  employees;

 

注意另一種可能存在錯誤卻不容易發現錯誤的情況:

SELECT
	CONCAT((case commission_pct  WHEN   null then "lala" else commission_pct end), '88' ) ,commission_pct,
	department_id
FROM
	employees;

看似沒有問題,實際有問題,問題原因就是null的判斷不能用=進行判斷。簡單說就是:語法1中的case表達式的值與後面的when的值使用的=進行判等,但是mysql中必須使用is 或者is not。

 

總結:

1:語法1是將case後面的表達式值計算好之後跟後面的when條件的值使用“=”進行判斷相等,相等就進入該分支。

2:語法2是不需要case後面有表達式,直接評估when後面的條件值即可,如果爲true則進入。

 

參考文檔:https://dev.mysql.com/doc/refman/5.7/en/case.html

補充:官方文檔永遠是解決問題的王道!!!

拓展:如果只針對null值進行替換的話可以使用ifnull函數:

SELECT 
	IFNULL(commission_pct,"commission_pct爲null") ,commission_pct,department_id
FROM
	employees;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章