CASE表达式
# 180.CASE表达式
CASE
是 SQL 中数一数二的重要功能,希望大家能够在这里好好学习掌握。
# 什么是 CASE
表达式
CASE
** 表达式** 也是函数的一种,主要是用来判断和运算,在编程中通常称为 (条件)分支 。
case可以理解为当... 就... 。比如:
- 当下雨时,就大伞
- 当出太阳,就不打伞
- 当下冰雹,就不出门
- .......
SQL 中的CASE 和 编程语言中的 CASE很类似
# CASE
表达式的语法
语法:
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.
.
.
ELSE <表达式>
END
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
WHEN
** ** 子句 中的“< 求值表达式 >”就是使用谓词编写出来的表达式,例如“列 =
值”,或使用=
、!=
LIKE
、BETWEEN
等谓词编写出来的
CASE
表达式会从对最初的 WHEN
子句中的“< 求值表达式 >”进行求值,也就是计算出该表达式的真值是什么,计算出来后:
- 如果结果为真(
TRUE
),那么就返回THEN
** 子句** 中的表达式,CASE
表达式的执行到此为止。 - 如果结果不为真,那么就跳转到下一条
WHEN
子句的求值之中。 - 如果直到最后的
WHEN
子句为止返回结果都不为真,那么就会返回ELSE
中的表达式,执行终止。
注意:CASE表达式最终会返回一个值,无论写了多少行,最后也是只返回一个值。
# CASE
表达式的使用方法
接下来就开始使用case。来考虑这样一种情况,现在 Product
表中包含衣服、办公用品和厨房用具 3 种商品类型,我们想要在查询出数据后,在商品种类前添加几个字母代号:
A :衣服
B :办公用品
C :厨房用具
1
2
3
2
3
因为表中的记录并不包含“A
:”或者“B
:”这样的字符串,所以需要在 SQL 中进行添加,可以考虑使用字符串拼接符号(concat)。
然后就是怎么根据商品种类,拼接对应的字符“A
:”“B
:”“C
了,这时就可以使用 CASE
表达式来实现:
SELECT product_name,
CASE WHEN product_type = '衣服' THEN concat('A: ', product_type)
WHEN product_type = '办公用品' THEN concat('B: ', product_type)
WHEN product_type = '厨房用具' THEN concat('C: ', product_type)
ELSE NULL
END AS abc_product_type
FROM Product;
-- 结果:
+--------------+------------------+
| product_name | abc_product_type |
+--------------+------------------+
| T恤 | A: 衣服 |
| 打孔器 | B: 办公用品 |
| 运动T恤 | A: 衣服 |
| 菜刀 | C: 厨房用具 |
| 高压锅 | C: 厨房用具 |
| 叉子 | C: 厨房用具 |
| 擦菜板 | C: 厨房用具 |
| 圆珠笔 | B: 办公用品 |
+--------------+------------------+
8 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
注意:
- 注意,每个分支返回的数据类型都得是一致的。
ELSE
子句指定了应该如何处理不满足WHEN
子句中的条件的记录。ELSE NULL
的意思是“如果出现上述情况之外的时候,返回NULL
”。除了NULL
,其他值或者表达式也都可以写在ELSE
子句之中ELSE
子句也可以省略不写,这时会被默认为ELSE NULL
。但为了可读性,还是建议写出CASE
表达式最后的“END
”是不能省略的,忘写会发生语法错误
# CASE 简写
语法:
CASE <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
.
.
.
ELSE <表达式>
END
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
执行顺序说明:
- 首先会计算CASE 关键字之后的表达式的值
- 然后从最初的
WHEN
子句开始进行,逐一计算WHEN
后面的表达式的值,看是否和第一步的值相同,是则返回THEN
** 子句** 中的表达式,不是跳转到下一条WHEN
子句的求值之中
刚刚的SQL也可以简写为:
SELECT product_name,
CASE product_type
WHEN '衣服' THEN concat('A: ', product_type)
WHEN '办公用品' THEN concat('B: ', product_type)
WHEN '厨房用具' THEN concat('C: ', product_type)
ELSE NULL
END AS abc_product_type
FROM Product;
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
这样简化了书写,但如果想要在 WHEN
子句中指定不同列时,就无能为力了,得用之前的写法
上次更新: 2024/1/23 16:20:41