欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中的case?when中對于NULL值判斷的坑及解決

 更新時間:2023年12月08日 14:33:41   作者:hanjq_code  
這篇文章主要介紹了MySQL中的case?when中對于NULL值判斷的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

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)這個錯誤呢?是將第一種語法與第二種語法混用導致的,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則進入。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論