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

MySQL中case?when對(duì)NULL值判斷的踩坑記錄

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

前言

今天在開發(fā)程序中,從MySQL中提取數(shù)據(jù)的時(shí)候,使用到了case when的語法用來做判斷,在使用過程中在判斷NULL值的時(shí)候遇到個(gè)小問題

sql中的case when 有點(diǎn)類似于Java中的switch語句,比較靈活,但是在Mysql中對(duì)于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等。該種語法不能用于測(cè)試NULL。

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

為什么會(huì)出現(xiàn)這個(gè)錯(cuò)誤呢?是將第一種語法與第二種語法混用導(dǎo)致的,case 后面commission_pct 的值有兩種:真實(shí)值或者為null,而 when 后面的commission_pct is null 也有兩個(gè)值:true或者false,所以case 后面為null時(shí)候永遠(yuǎn)無法跟true或false匹配,因此輸出不為null。

對(duì)于該種情況如果必須要用語法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;

注意另一種可能存在錯(cuò)誤卻不容易發(fā)現(xiàn)錯(cuò)誤的情況:

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)行判斷。簡(jiǎ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á)式,直接評(píng)估when后面的條件值即可,如果為true則進(jìn)入。

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

相關(guān)文章

  • MySQL使用聚合函數(shù)進(jìn)行單表查詢

    MySQL使用聚合函數(shù)進(jìn)行單表查詢

    這篇文章主要介紹了MySQL使用聚合函數(shù)進(jìn)行單表查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • MySQL 5.7升級(jí)8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總

    MySQL 5.7升級(jí)8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總

    MySQL 5.7.34 升級(jí)到 8.0.32 后部分查詢語句報(bào)錯(cuò)如下,ERROR 1267 (HY000),比較操作中使用不同的字符集或排序規(guī)則通常會(huì)觸發(fā)此問題,所以本文給大家介紹了MySQL 5.7升級(jí)8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總,需要的朋友可以參考下
    2024-06-06
  • 為什么MySQL選擇Repeatable Read作為默認(rèn)隔離級(jí)別

    為什么MySQL選擇Repeatable Read作為默認(rèn)隔離級(jí)別

    關(guān)于MySQL的事務(wù)隔離級(jí)別,相信很多讀者都不陌生,那么,你知道為什么Oracle選擇RC作為默認(rèn)級(jí)別,而MySQL要選擇RR作為默認(rèn)的隔離級(jí)別嗎
    2021-07-07
  • MySQL8.0 MGR的維護(hù)管理

    MySQL8.0 MGR的維護(hù)管理

    數(shù)據(jù)庫已成為企業(yè)和管理員們最為關(guān)注的核心組件之一,本文主要介紹了MySQL8.0 MGR的維護(hù)管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Centos 7 安裝mysql5.7.24二進(jìn)制 版本的方法及解決辦法

    Centos 7 安裝mysql5.7.24二進(jìn)制 版本的方法及解決辦法

    這篇文章主要介紹了Centos 7 安裝mysql5.7.24二進(jìn)制 版本的方法 及遇到問題解決辦法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • MySQL數(shù)據(jù)庫實(shí)驗(yàn)實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計(jì)

    MySQL數(shù)據(jù)庫實(shí)驗(yàn)實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計(jì)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫實(shí)驗(yàn)實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計(jì),文章通過理解并能運(yùn)用數(shù)據(jù)庫設(shè)計(jì)的常見步驟來設(shè)計(jì)滿足給定需求的概念模和關(guān)系數(shù)據(jù)模型展開詳情,需要的朋友可以參考一下
    2022-06-06
  • Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句)

    Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句)

    這篇文章主要介紹了Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 詳解MySql自連接,外連接,內(nèi)連接?,左連接,右連接

    詳解MySql自連接,外連接,內(nèi)連接?,左連接,右連接

    這篇文章主要介紹了詳解MySql自連接,外連接,內(nèi)連接?,左連接,右連接,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Mysql中mysql.user用戶表詳解

    Mysql中mysql.user用戶表詳解

    在本篇文章里小編給大家分享了關(guān)于Mysql中mysql.user用戶表的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考下。
    2019-09-09
  • MYSQL造數(shù)據(jù)占用臨時(shí)表空間的解決方法

    MYSQL造數(shù)據(jù)占用臨時(shí)表空間的解決方法

    在MySQL中,臨時(shí)表空間并不是一個(gè)可以直接刪除的文件或目錄,因?yàn)榕R時(shí)表空間通常是由MySQL服務(wù)器在運(yùn)行時(shí)根據(jù)需要自動(dòng)創(chuàng)建和管理的,這篇文章主要介紹了MYSQL造數(shù)據(jù)占用臨時(shí)表空間,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

永顺县| 广东省| 夏河县| 湖南省| 安丘市| 宁蒗| 盈江县| 井研县| 克什克腾旗| 金塔县| 镇雄县| 巴彦县| 永川市| 丰原市| 芜湖市| 胶南市| 清流县| 六盘水市| 舟山市| 肇源县| 岱山县| 响水县| 大悟县| 昭通市| 竹山县| 长兴县| 阿鲁科尔沁旗| 克什克腾旗| 青浦区| 历史| 聂拉木县| 黑龙江省| 云梦县| 太仆寺旗| 达拉特旗| 马边| SHOW| 延川县| 西宁市| 江永县| 行唐县|