SQL进阶 CASE表达式(一)

310 阅读3分钟

概述

在数据库中,CASE表达式可以用于在查询语句中进行条件判断和结果返回。可以用于SELECT查询中的字段表达式、ORDER BY子句、WHERE子句等多个场景中,以根据不同的条件返回不同的结果。

它可以对数据库中的数据进行灵活的条件判断和处理,常用于根据不同的条件返回计算字段、分类汇总数据、动态排序等操作,但是,CASE表达式真正的价值却并不怎么为人所知。

基本语法

case表达式有两种写法,分别是简单CASE表达式搜索CASE表达式 语法如下:

    --简单CASE表达式
    CASE sex
      WHEN '1' THEN ’男’
      WHEN '2' THEN ’女’
    ELSE ’其他’ END

    --搜索CASE表达式
    CASE WHEN sex ='1'THEN’男’
        WHEN sex ='2'THEN’女’
    ELSE ’其他’ END

简单CASE表达式正如其名,写法简单,但能实现的事情比较有限。简单CASE表达式能写的条件,搜索CASE表达式也能写,所以基本上采用搜索CASE表达式的写法。

搜索CASE表达式更加强大和灵活,when后边还可以跟sql查询语句。需要注意的是,在发现为真的WHEN子句时,CASE表达式的真假值判断就会中止,而剩余的WHEN子句会被忽略。为了避免引起不必要的混乱,使用WHEN子句时要注意条件的排他性。

注意事项

使用CASE表达式的时候,还需要注意以下几点。

  • 注意事项1:统一各分支返回的数据类型
  • 注意事项2:不要忘了写END
  • 注意事项3:养成写ELSE子句的习惯

应用案例

总结一些非常少见但很实用的场景案例,比如:将已有编号方式转换为新的方式并统计,用一条SQL语句进行不同条件的统计,用CHECK约束定义多个列的条件关系 等等。

将已有编号方式转换为新的方式并统计

比如有一张订单表,订单的商品有手机,电脑,苹果等等,如果需要把某些商品的订单按照电子产品和水果两类分类进行统计,就需要将已有编号方式转换为新的方式并统计,语句如下:

SELECT CASE o.product_name
          WHEN '华为手机' THEN
           '电子产品'
          WHEN '苹果手机' THEN
           '电子产品'
          WHEN '苹果' THEN
           '水果'
          WHEN '香蕉' THEN
           '水果'
          ELSE
           '其它'
        END pro_type, SUM(o.order_amount) AS total_amount
FROM   cw_cou o
GROUP  BY CASE o.product_name
            WHEN '华为手机' THEN
             '电子产品'
            WHEN '苹果手机' THEN
             '电子产品'
            WHEN '苹果' THEN
             '水果'
            WHEN '香蕉' THEN
             '水果'
            ELSE
             '其它'
          END

统计结果:

pro_type   total_amount
电子产品	16000.00
水果	50.00

这里的关键在于将SELECT子句里的CASE表达式复制到GROUP BY子句里,必须在SELECT子句和GROUP BY子句这两处写一样的CASE表达式,固定写法。

还可以使用搜索CASE表达式,将数值按照适当的级别进行分类统计,统计语句如下:

SELECT CASE
         WHEN o.order_amount > 6500 THEN
          'a'
         WHEN o.order_amount <= 6000
              AND o.order_amount >= 4000 THEN
          'b'
         WHEN o.order_amount <= 50
              AND o.order_amount >= 10 THEN
          'c'
         ELSE
          NULL
       END as pro_level, SUM(o.order_amount) AS total_amount
FROM   tb_order o
GROUP  BY CASE
            WHEN o.order_amount > 6500 THEN
             'a'
            WHEN o.order_amount <= 6000
                 AND o.order_amount >= 4000 THEN
             'b'
            WHEN o.order_amount <= 50
                 AND o.order_amount >= 10 THEN
             'c'
            ELSE
             NULL
          END

下一章节见。