学而实习之 不亦乐乎

MySQL 中 CASE WHEN 语句用法

2024-04-14 19:38:54

一、使用方法

用法一(简单变量表达式):

case <表达式(变量)>
    when <表达式1(变量的值)> then <表达式1(符合变量值的结果)>
    when <表达式2(变量的值)> then <表达式2(符合变量值的结果)>
    when <表达式3(变量的值)> then <表达式3(符合变量值的结果)>
    ...
    else <表达式(符合变量值的结果)>
end

用法二(搜索变量表达式):

case
    when <求值表达式1(一般是判断)> then <表达式1(符合变量值的结果)>
    when <求值表达式2(一般是判断)> then <表达式2(符合变量值的结果)>
    when <求值表达式3(一般是判断)> then <表达式3(符合变量值的结果)>
    ...
    else <表达式(符合变量值的结果)>
end

注意:

第一种语法只能比较等于的条件。when后面如果是值,则是表示等于的意思,"="可以不用写,遇到满足条件的才返回,如果没有满足的条件则返回else里的结果,如果没有else则返回NULL。when后面如果是表达式,不管when的条件是否满足,都是返回else里的结果,如果没有else则返回NULL。

第二种语法可比较等于、范围的条件。遇到第一个满足条件的即返回,不再往下比较,如果没有满足的条件则返回else里的结果,如果没有else则返回NULL。

二、实例

1、实例一:分数统计

SELECT s_id
,(case when s_score>=90 then '优秀'
      when s_score>=80 then '良好'
      when s_score>=70 then '一般'
      when s_score>=60 then '及格'
      when s_score<60 then '不及格'
            end)成绩
FROM score

2、实例二:经典行转列,并配合聚合函数做统计,统计各个城市的各类能耗

如下表:

E_CODE  E_VALUE E_TYPE

北京    28.50   0

北京    23.51   1

北京    28.12   2

北京    12.30   0

北京    15.46   1

上海    18.88   0

上海    16.66   1

上海    19.99   0

SELECT
        E_CODE,
        SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,--水耗
        SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,--电耗
        SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY--热耗
FROM
        THTF_ENERGY_TEST
GROUP BY
        E_CODE

3、实例三:

有如下数据

国家(country)    人口(population)

中国    600

美国    100

加拿大  100

英国    200

法国    300

日本    250

德国    200

墨西哥  50

印度    250

想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。

如果使用Case函数,SQL代码如下:

SELECT  SUM(population),
        CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END
FROM    Table_A
GROUP BY CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END;

注释:

上述语句可以这样理解,将

CASE country
        WHEN '中国'     THEN '亚洲'
        WHEN '印度'     THEN '亚洲'
        WHEN '日本'     THEN '亚洲'
        WHEN '美国'     THEN '北美洲'
        WHEN '加拿大'  THEN '北美洲'
        WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END

这个子句整体看作一列A,则 上述语句就是一句普通的分组语句了:SELECT SUM(population), A FROM Table_A GROUP BY A;

4、实例四:判断工资的等级,并统计每一等级的人数

SELECT
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END salary_class,
        COUNT(*)
FROM    Table_A
GROUP BY
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END;