激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

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

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

2022-01-24 17:46追風(fēng)的浪子 Mysql

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

前言

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

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

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

注意:  這兩種語法是有區(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

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

現(xiàn)在實(shí)現(xiàn),如果a值為null 則取b值,否則取a值

方法1: ifnull 用法

?
1
2
3
4
5
6
7
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 用法

?
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;

發(fā)現(xiàn)得到的結(jié)果不對,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。

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

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

?
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;

看似沒有問題,實(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)入。

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本高清无遮挡 | 午夜视频观看 | 久久精热 | 国产成人自拍视频在线 | 午夜视频免费在线观看 | 91麻豆精品国产91久久久无需广告 | 久久男人 | 龙的两根好大拔不出去h | 欧美日韩夜夜 | 蜜桃视频网站www | 国产午夜精品在线 | 精品国产一区二区三区四 | 主人在调教室性调教女仆游戏 | 久久久久久久久久久高潮一区二区 | 成人在线视频在线观看 | 国产一区日韩精品 | 欧美人禽| 欧美人的天堂一区二区三区 | 亚洲91在线| 毛片免费观看视频 | 88xx成人永久免费观看 | 欧美h版在线观看 | 久久成人福利 | 国产精品免费大片 | 国产午夜精品理论片a级探花 | 久久久久久久久亚洲精品 | 色av成人天堂桃色av | 国产成人精品一区二区仙踪林 | 久久成人免费网 | 国产精品一区二区三区在线 | 中文字幕在线观看免费视频 | 国产一区二区三区黄 | 色综合久久久久综合99 | 一级在线观看视频 | 天天躁狠狠躁夜躁2020挡不住 | 欧美一级精品 | 欧美另类69xxxxx 视频 | 久久成人午夜视频 | 国产毛毛片一区二区三区四区 | 久久久人人爽 | 成年片在线观看 |