一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL中case when對NULL值判斷的踩坑記錄

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

2022-01-24 17:46追風的浪子 Mysql

最近在學習Hive基礎知識時,遇到了遇到了Case When Else End語法,這篇文章主要給大家介紹了關于MySQL中case when對NULL值判斷的踩坑記錄,需要的朋友可以參考下

前言

今天在開發程序中,從MySQL中提取數據的時候,使用到了case when的語法用來做判斷,在使用過程中在判斷NULL值的時候遇到個小問題

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

Mysql中case when語法:

語法1:

?
1
2
3
4
5
CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

語法2:

?
1
2
3
4
5
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后面的條件,如果滿足則執行。

案例實戰:

表結構如下:a 值為null, b值為1

?
1
2
3
4
5
6
mysql> SELECT NULL AS a, 1 AS b;
+------+---+
| a    | b |
+------+---+
| NULL | 1 |
+------+---+

現在實現,如果a值為null 則取b值,否則取a值

方法1: ifnull 用法

?
1
2
3
4
5
6
7
SELECT
    IFNULL(a, b) AS new,
    a,
    b
FROM
    -- 創建臨時表: a 的值為null ,b為1
    (SELECT NULL AS a, 1 AS b) tmp;

方法2: case when 用法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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;

發現得到的結果不對,new 的值居然為null ,而不是我們想要的1.

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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寫:

?
1
2
3
4
5
6
7
8
9
10
11
SELECT
    (
        CASE
        WHEN a is NULL  THEN b
        ELSE a
        END
    ) AS new,
    a,
    b
FROM
    (SELECT NULL AS a, 1 AS b) tmp;

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

?
1
2
3
4
5
6
7
8
9
10
11
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。

總結:

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

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

到此這篇關于MySQL中case when對NULL值判斷的文章就介紹到這了,更多相關MySQL case when對NULL值判斷內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/echojson/p/11612650.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久91精品国产91久久户 | 日本男女视频 | 亚洲成人aa | 国产精品视频第一区二区 | 亚洲 欧美 成人 | 免费看国产一级特黄aa大片 | 色婷婷在线视频 | 12-14娇小videos| 国产精品免费_区二区三区观看 | 17岁韩国在线观看免费1 | 99热在线精品播放 | 国产精品亚欧美一区二区三区 | 日韩欧美一区黑人vs日本人 | 五月天精品视频播放在线观看 | 4455在线 | 热门小说同人h改编h | 欧美日韩三区 | 亚洲 小说 欧美 激情 另类 | 久久伊人精品青青草原2021 | 国内小情侣一二三区在线视频 | 亚洲成年网站在线观看 | 精品日韩二区三区精品视频 | 欧美日韩在线一区二区三区 | xxxxx性中国hd| 亚洲 日本 天堂 国产 在线 | 日本强不卡在线观看 | 合欢视频免费 | 亚洲欧美综合人成野草 | 国产精品日韩在线观看 | 2012中文字幕中字视频 | 日韩性大片免费 | 亚洲 欧美 制服 校园 动漫 | 久久久精品国产免费A片胖妇女 | 国产精品亚洲午夜不卡 | 美日毛片 | 教室眠催白丝美女校花 | 国产欧美日韩精品高清二区综合区 | 精品视频在线观看 | 亚洲国产精品日本无码网站 | 天天草人人草 | 精品久久久久久久久久久久久久久 |