国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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追風的浪子 Mysql

最近在學習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:

?
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必須是一個表達式,例如 userid%2=1或者username is null等。該種語法不能用于測試NULL。

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

案例實戰(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)在實現(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)建臨時表: 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.

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

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

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

總結(jié):

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

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

到此這篇關(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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲欧美中文字幕 | 欧洲精品久久久久69精品 | 精品久久国产老人久久综合 | 欧美在线综合 | 久久精品国产v日韩v亚洲 | 欧美1级 | 国产日韩精品一区二区 | 日韩电影免费在线观看中文字幕 | 久久九九| 欧美在线观看免费观看视频 | 亚洲a网 | 婷婷精品久久久久久久久久不卡 | 精品av| 97成人精品视频在线观看 | 日韩在线精品视频 | 日韩在线视频一区 | 91视频网址 | 81精品国产乱码久久久久久 | 免费a网站 | 日韩福利电影 | 精久久久 | 亚洲成人精品在线观看 | 国产精品一区二区视频 | 中文字幕视频一区 | www.亚洲黄色| 日韩高清在线一区二区三区 | 色综合久久天天综合网 | 亚洲三级av | 欧美在线视屏 | 国产裸体永久免费视频网站 | 亚洲久久久久 | 在线播放国产一区二区三区 | 欧美在线视频网 | 国产成人精品一区二区三区视频 | 国产高清一 | 国产精品成人国产乱一区 | porn国产精品 | 亚洲黄色片免费观看 | 国产中文在线 | 天天操夜夜爽 | 亚洲精品久久久久久久久久久久久 |