搜索 K
Appearance
博客正在加载中...
Appearance
CASE 是 SQL 中数一数二的重要功能,希望大家能够在这里好好学习掌握。
CASE 表达式 CASE表达式 也是函数的一种,主要是用来判断和运算,在编程中通常称为 (条件)分支 。
case 可以理解为当... 就... 。比如:
SQL 中的 CASE 和 编程语言中的 CASE 很类似
CASE 表达式的语法 语法:
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.
.
.
ELSE <表达式>
ENDWHEN **** 子句 中的“< 求值表达式 >”就是使用谓词编写出来的表达式,例如“列 = 值”,或使用 = 、!= LIKE 、BETWEEN 等谓词编写出来的
CASE 表达式会从对最初的 WHEN 子句中的“< 求值表达式 >”进行求值,也就是计算出该表达式的真值是什么,计算出来后:
TRUE ),那么就返回 THEN子句 中的表达式,CASE 表达式的执行到此为止。WHEN 子句的求值之中。WHEN 子句为止返回结果都不为真,那么就会返回 ELSE 中的表达式,执行终止。注意:CASE 表达式最终会返回一个值,无论写了多少行,最后也是只返回一个值。
CASE 表达式的使用方法 接下来就开始使用 case。来考虑这样一种情况,现在 Product 表中包含衣服、办公用品和厨房用具 3 种商品类型,我们想要在查询出数据后,在商品种类前添加几个字母代号:
A :衣服
B :办公用品
C :厨房用具因为表中的记录并不包含“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) 注意:
ELSE 子句指定了应该如何处理不满足 WHEN 子句中的条件的记录。 ELSE NULL 的意思是“如果出现上述情况之外的时候,返回 NULL ”。除了 NULL,其他值或者表达式也都可以写在 ELSE 子句之中ELSE 子句也可以省略不写,这时会被默认为 ELSE NULL 。但为了可读性,还是建议写出CASE 表达式最后的“END ”是不能省略的,忘写会发生语法错误 语法:
CASE <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
.
.
.
ELSE <表达式>
END执行顺序说明:
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;这样简化了书写,但如果想要在 WHEN 子句中指定不同列时,就无能为力了,得用之前的写法 (完)