本文基于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_value
为true
的结果。第二种语法返回第一个condition
为true
的结果。如果没有比较或条件为真,则返回ELSE之后的结果,如果没有ELSE部分,则返回NULL。
CASE
表达式的返回类型是所有结果值的聚合类型:
- 如果所有类型都是数字,则聚合类型也是数字:
- 如果至少一个参数是双精度,则结果是双精度。
- 否则,如果至少有一个参数是
DECIMAL
,则结果是DECIMAL
。 - 否则,结果是整数类型(有一个例外):
- 如果所有整数类型都是有符号的或都是无符号的,则结果是相同的符号并且精度是所有指定整数类型(即
TINYINT
、SMALLINT
、MEDIUMINT
、INT
或者BIGINT
) 中最高的。 - 如果是有符号和无符号整数类型的组合,结果是有符号的,精度可能更高。例如,如果类型分别为有符号的
INT
和 无符号INT
,则结果为有符号的BIGINT
。 - 例外的情况是无符号的
BIGINT
,与任何有符号的整数类型相结合。结果 都是具有足够的精度和小数位数 0 的DECIMAL
。
- 如果所有整数类型都是有符号的或都是无符号的,则结果是相同的符号并且精度是所有指定整数类型(即
- 如果所有类型都是
BIT
,则结果是BIT
。否则BIT
参数的处理方式类似于BIGINT
。 - 如果所有类型都是
YEAR
,则结果是YEAR
。否则YEAR
参数的处理方式类似于INT
。 - 如果所有类型都是字符串(
CHAR
或VARCHAR
),则结果是VARCHAR
,最大长度由操作数的最长字符长度决定。 - 如果所有类型都是字符或二进制字符串,则结果为
VARBINARY
. SET
和ENUM
的处理与VARCHAR
类似,结果是VARCHAR
。- 如果所有类型都是
JSON
,则结果是JSON
。 - 如果所有类型都是时间型的,则结果是时间型的:
- 如果所有时间类型均为
DATE
、TIME
或TIMESTAMP
,则结果分别为DATE
、TIME
或TIMESTAMP
。 - 否则,如果是时间类型的混合,结果是
DATETIME
.
- 如果所有时间类型均为
- 如果所有类型都是
GEOMETRY
,则结果是GEOMETRY
。 - 如果任何类型是
BLOB
,则结果是BLOB
。 - 对于所有其他类型组合,结果为
VARCHAR
。 NULL
类型聚合忽略 文字操作数。
示例
mysql> SELECT CASE url WHEN 'www.02405.com' 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来结束。