本文基于MySQL 8.0版本

https://dev.mysql.com/doc/refman/8.0/en/flow-control-functions.html#operator_case

语法

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

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

说明

MySQL CASE函数是MySQL流程控制函数的一种,上面两种语法分别对应两种不同的方式:第一种语法返回第一个value=compare_valuetrue的结果。第二种语法返回第一个conditiontrue的结果。如果没有比较或条件为真,则返回ELSE之后的结果,如果没有ELSE部分,则返回NULL。

CASE表达式的返回类型是所有结果值的聚合类型:

  • 如果所有类型都是数字,则聚合类型也是数字:
    • 如果至少一个参数是双精度,则结果是双精度。
    • 否则,如果至少有一个参数是 DECIMAL,则结果是 DECIMAL
    • 否则,结果是整数类型(有一个例外):
      • 如果所有整数类型都是有符号的或都是无符号的,则结果是相同的符号并且精度是所有指定整数类型(即TINYINTSMALLINTMEDIUMINTINT或者BIGINT) 中最高的。
      • 如果是有符号和无符号整数类型的组合,结果是有符号的,精度可能更高。例如,如果类型分别为有符号的INT和 无符号 INT,则结果为有符号的 BIGINT
      • 例外的情况是无符号的 BIGINT,与任何有符号的整数类型相结合。结果 都是具有足够的精度和小数位数 0 的DECIMAL
  • 如果所有类型都是BIT,则结果是BIT。否则BIT参数的处理方式类似于BIGINT
  • 如果所有类型都是YEAR,则结果是YEAR。否则 YEAR参数的处理方式类似于 INT
  • 如果所有类型都是字符串(CHAR或 VARCHAR),则结果是VARCHAR,最大长度由操作数的最长字符长度决定。
  • 如果所有类型都是字符或二进制字符串,则结果为 VARBINARY.
  • SETENUM的处理与VARCHAR类似,结果是VARCHAR
  • 如果所有类型都是JSON,则结果是JSON
  • 如果所有类型都是时间型的,则结果是时间型的:
    • 如果所有时间类型均为 DATE、 TIME或 TIMESTAMP,则结果分别为DATE、 TIME或 TIMESTAMP
    • 否则,如果是时间类型的混合,结果是 DATETIME.
  • 如果所有类型都是GEOMETRY,则结果是GEOMETRY
  • 如果任何类型是BLOB,则结果是BLOB
  • 对于所有其他类型组合,结果为 VARCHAR
  • NULL类型聚合忽略 文字操作数。

示例

mysql> SELECT CASE url WHEN 'www.codesou.cn' THEN '码农资源网' WHEN 'www.duanpianmi.com' THEN '短篇迷' ELSE '位置网站' END;

mysql> SELECT CASE WHEN score >= 85 THEN '优秀' WHEN score >= 60 and score < 85 THEN '及格' ELSE '差' END;

注意

在MySQL中还存在着同名的CASE流程控制语句,与本文讲解的CASE函数不同CASE流程控制语句应用于存储过程,并且不包含ELSE NULL子句,并且用END CASE而不是END来结束。