91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中case?when對NULL值判斷的踩坑分析

發布時間:2021-12-14 16:25:11 來源:億速云 閱讀:299 作者:iii 欄目:開發技術

本篇內容介紹了“MySQL中case when對NULL值判斷的踩坑分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

前言

在開發程序中,從MySQL中提取數據的時候,使用到了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

注意:  這兩種語法是有區別的,區別如下:

1:第一種語法:case_value必須是一個表達式,例如 userid%2=1或者username is null等。該種語法不能用于測試NULL。

2:第二種語法CASE后面不需要變量或者表達式,直接執行時候評估每一個WHEN后面的條件,如果滿足則執行。

案例實戰:

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

mysql> SELECT NULL AS a, 1 AS b;

+------+---+

| a    | b |

+------+---+

| NULL | 1 |

+------+---+

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

方法1: ifnull 用法

SELECT

    IFNULL(a, b) AS new,

    a,

    b

FROM

    -- 創建臨時表: 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;

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

為什么會出現這個錯誤呢?是將第一種語法與第二種語法混用導致的,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;

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

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。

“MySQL中case when對NULL值判斷的踩坑分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

慈溪市| 临泉县| 西平县| 常宁市| 南漳县| 宁化县| 思茅市| 雷波县| 和龙市| 台东县| 崇义县| 固原市| 鹤壁市| 甘泉县| 澄迈县| 瓮安县| 大埔区| 温州市| 饶河县| 丹东市| 邢台县| 廊坊市| 肃宁县| 康乐县| 望谟县| 新野县| 客服| 泸西县| 通城县| 乌兰浩特市| 长乐市| 武安市| 远安县| 绥滨县| 南木林县| 渑池县| 临桂县| 扎兰屯市| 汕头市| 瑞丽市| 静乐县|