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

MySQL中case?when對NULL值判斷的踩坑記錄

 更新時間:2021年12月14日 12:54:01   作者:追風(fēng)的浪子  
最近在學(xué)習(xí)Hive基礎(chǔ)知識時,遇到了遇到了Case?When?Else?End語法,這篇文章主要給大家介紹了關(guān)于MySQL中case?when對NULL值判斷的踩坑記錄,需要的朋友可以參考下

前言

今天在開發(fā)程序中,從MySQL中提取數(shù)據(jù)的時候,使用到了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)這個錯誤呢?是將第一種語法與第二種語法混用導(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。

總結(jié):

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

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

到此這篇關(guān)于MySQL中case?when對NULL值判斷的文章就介紹到這了,更多相關(guān)MySQL?case?when對NULL值判斷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL索引失效場景及解決方案

    MySQL索引失效場景及解決方案

    這篇文章主要介紹了MySQL索引失效場景及解決方案,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • MySQL索引的基本語法

    MySQL索引的基本語法

    這篇文章主要介紹了MySQL索引的基本語法,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08
  • mysql的select?into給多個字段變量賦值方式

    mysql的select?into給多個字段變量賦值方式

    這篇文章主要介紹了mysql的select?into給多個字段變量賦值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql 5.6.23 安裝配置環(huán)境變量教程

    mysql 5.6.23 安裝配置環(huán)境變量教程

    這篇文章主要為大家詳細介紹了mysql 5.6.23 安裝配置環(huán)境變量教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 深入了解MySQL中聚合函數(shù)的使用

    深入了解MySQL中聚合函數(shù)的使用

    這篇文章主要為大家詳細介紹一下MySQL中聚合函數(shù)的使用,文中的示例代碼講解詳細,對我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • 淺談mysql通配符進行模糊查詢的實現(xiàn)方法

    淺談mysql通配符進行模糊查詢的實現(xiàn)方法

    這篇文章主要介紹了淺談mysql通配符進行模糊查詢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • MySQL 索引分析和優(yōu)化

    MySQL 索引分析和優(yōu)化

    MySQL 索引分析和優(yōu)化...
    2006-12-12
  • PHP mysqli 增強 批量執(zhí)行sql 語句的實現(xiàn)代碼

    PHP mysqli 增強 批量執(zhí)行sql 語句的實現(xiàn)代碼

    本篇文章介紹了,在PHP中 mysqli 增強 批量執(zhí)行sql 語句的實現(xiàn)代碼。需要的朋友參考下
    2013-05-05
  • MySQL最左匹配原則詳細分析

    MySQL最左匹配原則詳細分析

    首先回顧一下什么是最左匹配(也有稱之為最左前綴)?顧名思義:最左優(yōu)先,以最左邊的為起點任何連續(xù)的索引都能匹配上。同時遇到范圍查詢(>、<、between、like)就會停止匹配
    2022-12-12
  • MySQL之where使用詳解

    MySQL之where使用詳解

    我們需要獲取數(shù)據(jù)庫表數(shù)據(jù)的特定子集時,可以使用where子句指定搜索條件進行過濾。本文主要介紹了MySQL之where使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論