zoukankan      html  css  js  c++  java
  • CASE 表达式

    CASE 表达式简介

    ● CASE 表达式分为简单 CASE 表达式和搜索 CASE 表达式两种。搜索 CASE 表达式包含简单 CASE 表达式的全部功能

    ● 虽然CASE表达式中的 ELSE 子句可以省略,但为了让 SQL 语句更加容易理解,不要省略

    ● CASE 表达式中的 END 不能省略

    ● 使用 CASE 表达式能够将 SELECT 语句的结果进行组合

    ● 有些 DBMS 提供了各自特有的 CASE 表达式的简化函数,例如 Oracle 中的 DECODE 和 MySQL 中的 IF

    建表语句

    CREATE TABLE `product` (
      `product_id` int(11) NOT NULL,
      `product_name` varchar(32) DEFAULT NULL,
      `product_type` varchar(32) DEFAULT NULL,
      `purchase_price` int(11) DEFAULT NULL,
      `sale_price` int(11) DEFAULT NULL,
      `description` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`product_id`),
      KEY `product_name` (`product_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `purchase_price`, `sale_price`, `description`) VALUES ('1','ball','toys','13','25',null);
    INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `purchase_price`, `sale_price`, `description`) VALUES ('2','pencil','tools','10','20',null);
    INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `purchase_price`, `sale_price`, `description`) VALUES ('3','orange','fruits','5','8',null);
    INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `purchase_price`, `sale_price`, `description`) VALUES ('4','apple','fruits','6','10',null);
    INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `purchase_price`, `sale_price`, `description`) VALUES ('5','phone','tools',null,null,null);
    INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `purchase_price`, `sale_price`, `description`) VALUES ('6','banana','fruits','11','16','very delicious');
    

    CASE 表达式语法

    CASE WHEN <求值表达式> THEN <表达式>
     WHEN <求值表达式> THEN <表达式>
     WHEN <求值表达式> THEN <表达式>
     . . .
     ELSE <表达式>
    END
    

    CASE 表达式示例

    -- CASE 表达式用法 MySQL
    SELECT product_name,
     CASE WHEN product_type = 'fruits'
     THEN concat('A :',product_type)
     WHEN product_type = 'tools'
     THEN concat('B :',product_type)
     WHEN product_type = 'toys'
     THEN concat('C :',product_type)
     ELSE NULL
     END AS abc_product_type
     FROM Product;
     
     
     -- CASE 表达式用法 ORACLE
    SELECT product_name,
     CASE WHEN product_type = 'fruits'
     THEN 'A :' ||  product_type
     WHEN product_type = 'tools'
     THEN 'B :' || product_type
     WHEN product_type = '厨房用具'
     THEN 'C :' || product_type
     ELSE NULL
     END AS abc_product_type
     FROM Product;
    

    无论 CASE ... END 语句有多少行,返回的结果也不会很复杂

    翻转执行结果

    考虑如何输出以下结果:

    +------------------+-----------------+----------------+
    | sum_price_fruits | sum_price_tools | sum_price_toys |
    +------------------+-----------------+----------------+
    |               34 |              20 |             25 |
    +------------------+-----------------+----------------+
    

    一般写法只能输出以下结果:

    mysql> SELECT product_type,SUM(sale_price) AS sale_price_sum FROM product GROUP BY product_type;
    +--------------+----------------+
    | product_type | sale_price_sum |
    +--------------+----------------+
    | fruits       |             34 |
    | tools        |             20 |
    | toys         |             25 |
    +--------------+----------------+
    3 rows in set (0.01 sec)
    

    使用 CASE 表达式可以输出理想结果:

    mysql> SELECT SUM(CASE WHEN product_type='fruits' THEN sale_price ELSE 0 END ) AS sum_price_fruits,
        -> SUM(CASE WHEN product_type="tools" THEN sale_price ELSE 0 END ) AS sum_price_tools,
        -> SUM(CASE WHEN product_type="toys" THEN sale_price ELSE 0 END ) AS sum_price_toys
        -> FROM  product;
    +------------------+-----------------+----------------+
    | sum_price_fruits | sum_price_tools | sum_price_toys |
    +------------------+-----------------+----------------+
    |               34 |              20 |             25 |
    +------------------+-----------------+----------------+
    1 row in set (0.01 sec)
    
  • 相关阅读:
    Centos7下编译CDH版本hadoop源码支持Snappy压缩
    Sqoop异常:Please set $ACCUMULO_HOME to the root of your Accumulo installation.
    Sqoop入门
    Sqoop异常:Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
    Mac下配置多个SSH KEY访问远程Git服务
    ANDROID_MARS学习笔记_S02重置版_001_HanderLooperMessageThreadThreadLocal
    ANDROID_MARS学习笔记_S05_006_距离传感器
    ANDROID_MARS学习笔记_S05_005_方向传感器
    ANDROID_MARS学习笔记_S05_004_过滤杂质,得到真正的加速度
    ANDROID_MARS学习笔记_S05_003_传感器采样率及属性
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/14279552.html
Copyright © 2011-2022 走看看