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)