最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

case when 中對于NULL值判斷的坑

sql中的case when 有點(diǎn)類似于Java中的switch語句,比較靈活,但是在Mysql中對于Null的處理有點(diǎn)特殊;

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必須是一個(gè)表達(dá)式,例如 userid%2=1或者username is null等。該種語法不能用于測試NULL。

2:第二種語法CASE后面不需要變量或者表達(dá)式,直接執(zhí)行時(shí)候評估每一個(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é)果不對,new 的值居然為null ,而不是我們想要的1.

為什么會出現(xiàn)這個(gè)錯誤呢?是將第一種語法與第二種語法混用導(dǎo)致的,case 后面commission_pct 的值有兩種:真實(shí)值或者為null,而 when 后面的commission_pct is null 也有兩個(gè)值:true或者false,所以case 后面為null時(shí)候永遠(yuǎn)無法跟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;

看似沒有問題,實(shí)際有問題,問題原因就是null的判斷不能用=進(jìn)行判斷。

簡單說就是:

語法1中的case表達(dá)式的值與后面的when的值使用的=進(jìn)行判等,但是mysql中必須使用is 或者is not。

總結(jié)

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

2:語法2是不需要case后面有表達(dá)式,直接評估when后面的條件值即可,如果為true則進(jìn)入。

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

相關(guān)文章

  • mysql截取json對象特定數(shù)據(jù)的場景示例詳解

    mysql截取json對象特定數(shù)據(jù)的場景示例詳解

    這篇文章主要為大家介紹了mysql中截取json對象特定數(shù)據(jù)的場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • mysql存數(shù)組的實(shí)例代碼和方法

    mysql存數(shù)組的實(shí)例代碼和方法

    在本文中我們給大家整理了關(guān)于mysql存數(shù)組的實(shí)例代碼和方法以及相關(guān)知識點(diǎn),有需要的朋友們跟著學(xué)習(xí)下。
    2019-05-05
  • MySQL按時(shí)間進(jìn)行表分區(qū)的方法代碼

    MySQL按時(shí)間進(jìn)行表分區(qū)的方法代碼

    本文介紹如何在MySQL中創(chuàng)建按月份分區(qū)的表,并通過修改配置文件或使用數(shù)據(jù)庫事件來實(shí)現(xiàn)自動分區(qū),文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-09-09
  • mysql?8.0.26?安裝配置方法圖文教程

    mysql?8.0.26?安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql?8.0.26?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • MySQL實(shí)現(xiàn)分布式鎖

    MySQL實(shí)現(xiàn)分布式鎖

    這篇文章主要介紹了MySQL實(shí)現(xiàn)分布式鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • mysql服務(wù)性能優(yōu)化—my.cnf_my.ini配置說明詳解(16G內(nèi)存)

    mysql服務(wù)性能優(yōu)化—my.cnf_my.ini配置說明詳解(16G內(nèi)存)

    這篇文章主要介紹了mysql服務(wù)性能優(yōu)化—my.cnf_my.ini配置說明詳解(16G內(nèi)存),需要的朋友可以參考下
    2016-05-05
  • MySQL壓縮表創(chuàng)建方法示例詳解

    MySQL壓縮表創(chuàng)建方法示例詳解

    本文給大家介紹MySQL壓縮表創(chuàng)建方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-09-09
  • 使用shardingsphere實(shí)現(xiàn)mysql數(shù)據(jù)庫分片方式

    使用shardingsphere實(shí)現(xiàn)mysql數(shù)據(jù)庫分片方式

    本文介紹如何使用ShardingSphere-JDBC在SpringBoot中實(shí)現(xiàn)MySQL水平分庫,涵蓋分片策略、路由算法及零侵入配置方法,適用于大數(shù)據(jù)場景下的數(shù)據(jù)庫擴(kuò)展
    2025-08-08
  • mysql數(shù)據(jù)庫插入速度和讀取速度的調(diào)整記錄

    mysql數(shù)據(jù)庫插入速度和讀取速度的調(diào)整記錄

    由于項(xiàng)目變態(tài)需求;需要在一個(gè)比較短時(shí)間段急劇增加數(shù)據(jù)庫記錄(兩三天內(nèi),由于0增加至4億)。在整個(gè)過程調(diào)優(yōu)過程非常艱辛
    2012-07-07
  • mysql查看索引的方式

    mysql查看索引的方式

    這篇文章主要介紹了mysql查看索引的方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

木兰县| 文化| 堆龙德庆县| 禹州市| 连平县| 三门县| 建阳市| 塔城市| 灵山县| 齐齐哈尔市| 绥棱县| 桐梓县| 泗阳县| 萨迦县| 潢川县| 五峰| 浮山县| 永登县| 德钦县| 绥芬河市| 新沂市| 玉林市| 酒泉市| 伊春市| 大厂| 平顶山市| 修武县| 沭阳县| 宁化县| 南皮县| 竹溪县| 河间市| 建湖县| 稷山县| 固阳县| 玉田县| 桃园市| 新沂市| 惠安县| 丽江市| 满城县|