MySQL CASE 表达式是控制流函数的一部分,它使我们能够将if-else 或 if-then-else逻辑写入查询。此表达式可用于任何使用有效程序或查询的地方,例如 SELECT、WHERE、ORDER BY 子句等。

CASE 表达式验证各种条件并在第一个条件为true时返回结果。一旦满足条件,它就会停止遍历并给出输出。如果它找不到任何条件为真,则执行else 块。当没有找到 else 块时,它返回一个NULL值。MySQL CASE 语句的主要目标是处理 SELECT 子句中的多个 IF 语句。

我们可以通过两种方式使用 CASE 语句,具体如下:

一、简单的CASE语句

第一种方法是取一个值并将其与给定的语句匹配,如下所示。

CASE value   
WHEN [compare_value] THEN result
[WHEN [compare_value] THEN result ...]
[ELSE result]
END

当第一个compare_value比较为true时,它返回结果。否则,它将返回 else 子句。

示例

# 根据类别id,确定对应的主营类型
select
(
CASE category_id
WHEN 35 THEN '生鲜果蔬'
WHEN 36 THEN '休闲零食'
WHEN 37 THEN '蛋糕烘焙'
WHEN 38 THEN '茶饮酒水'
WHEN 39 THEN '滋补保健'
WHEN 40 THEN '粮油米面'
WHEN 41 THEN '综合食品'
WHEN 26 THEN '汽车养护'
WHEN 31 THEN '充值缴费'
ELSE ' '
END
) as ’ 商 品 类 目 ‘
FROM
shopxx.xx_platform;

二、检索CASE语句

第二种方法是在WHEN子句中考虑一个search_condition,如果找到,则在相应的 THEN 子句中返回结果。否则,它将返回 else 子句。如果没有指定 else 子句,它将返回一个 NULL 值。

CASE   
WHEN [condition] THEN result
[WHEN [condition] THEN result ...]
[ELSE result]
END

示例

# 根据商品类型不同,描述信息存放的字段也不一样
SELECT id,id,goods,organize supplier_id,productType,is_list,is_marketable,
(
CASE
WHEN productType = 9 OR productType = 11 THEN detail_image #虚拟商品
ELSE product_desc # 实物商品
END
) spu_describe
FROM
xx_product
WHERE
pfid = 20000
AND del_state IS NULL;# 删除状态字段为NULL代表未删除

三、MySQL CASE表达式的返回类型

CASE 表达式根据使用它的上下文返回结果。例如:

  • 如果在字符串上下文中使用,则返回字符串结果。
  • 如果在数字上下文中使用,则返回整数、浮点数、十进制值。

四、 MySQL CASE表达式 版本支持

CASE语句可以支持以下​​MySQL版本​​:

  • MySQL 8.0
  • MySQL 5.7
  • MySQL 5.6
  • MySQL 5.5
  • MySQL 5.1
  • MySQL 5.0
  • MySQL 4.1
  • MySQL 4.0
  • MySQL 3.23.3

最后

虽然MySQL CASE语法可以帮我们方便的处理一些类似​​switch...case​​ 这样的逻辑,但是在项目中,对于一些需要经常操作数据库的操作不建议这样做。复杂语法会消耗数据库的性能,C端接口一定要用缓存

最后推荐大家几款优秀的SQL格式化工具:

http://www.toolscat.com/format/sql

http://www.wetools.com/sql-formatter