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)
原文地址:https://www.cnblogs.com/zzzwqh/p/14279552.html