CASE 搜索语句

除了 IF 函数,MySQL 还提供了一个替代的条件语句 CASE。 MySQL 的 CASE 语句使代码更加可读和高效。

CASE 语句有两种形式:简单的 CASE 语句和可搜索 CASE 语句

简单的 CASE 语句

简单的 CASE 语句就是指使用简单 CASE 语句来检查表达式的值与一组唯一值的匹配。

语法说明

CASE  <表达式>
   WHEN <值1> THEN <操作>
   WHEN <值2> THEN <操作>
   ...
   ELSE <操作>
END CASE;

其中:<表达式> 可以是任何有效的表达式。我们将 <表达式> 的值与每个 WHEN 子句中的值进行比较,例如 <值1>,<值2> 等。如果 <表达式> 和 <值n> 的值相等,则执行相应的 WHEN 分支中的命令 <操作>。如果 WHEN 子句中的 <值n> 没有与 <表达式> 的值匹配,则 ELSE 子句中的命令将被执行。ELSE 子句是可选的。如果省略 ELSE 子句,并且找不到匹配项,MySQL 将引发错误。

用法示例

(1)简单使用 CASE 函数,如下:

mysql> select CASE 1
    -> WHEN 1 THEN 'ONE'
    -> WHEN 2 THEN 'TWO'
    -> ELSE 'UNKNOW'
    -> END AS 'CASE_VAL';
+----------+
| CASE_VAL |
+----------+
| ONE      |
+----------+
1 row in set (0.03 sec)

有运行结果得知,CASE 语句的条件为 1,将匹配第一个 WHEN 语句,直接返回 “ONE” 字符串。

如果 CASE 语句的条件为 2,则匹配第二个 WHEN 语句,返回 “TWO” 字符串。如下:

mysql> select CASE 2
    -> WHEN 1 THEN 'ONE'
    -> WHEN 2 THEN 'TWO'
    -> ELSE 'UNKNOW'
    -> END AS 'CASE_VAL';
+----------+
| CASE_VAL |
+----------+
| TWO      |
+----------+
1 row in set (0.04 sec)

如果 CASE 语句的条件不为 1 且也不为 2,则匹配 ELSE 语句。如下:

mysql> select CASE 3
    -> WHEN 1 THEN 'ONE'
    -> WHEN 2 THEN 'TWO'
    -> ELSE 'UNKNOW'
    -> END AS 'CASE_VAL';
+----------+
| CASE_VAL |
+----------+
| UNKNOW   |
+----------+
1 row in set (0.04 sec)

(2)使用简单的 CASE 函数根据当前日期的周索引,返回当前日期的中文星期名。如下:

mysql> select CASE WEEKDAY(NOW())
    -> WHEN 0 THEN '星期一'
    -> WHEN 1 THEN '星期二'
    -> WHEN 2 THEN '星期三'
    -> WHEN 3 THEN '星期四'
    -> WHEN 4 THEN '星期五'
    -> WHEN 5 THEN '星期六'
    -> WHEN 6 THEN '星期天'
    -> ELSE '无效周索引'
    -> END as WEEK_NAME;
+-----------+
| WEEK_NAME |
+-----------+
| 星期三    |
+-----------+
1 row in set (0.07 sec)

可搜索的 CASE 语句

简单 CASE 语句仅允许将表达式的值与一组不同的值进行匹配。为了执行更复杂的匹配,如范围,则可以使用可搜索 CASE 语句。可搜索 CASE 语句等同于 IF 语句,但是它的构造更加可读。

语法说明

CASE
    WHEN <条件1> THEN <命令>
    WHEN <条件2> THEN <命令>
    ...
    ELSE commands
END CASE;

MySQL 将分别计算 WHEN 子句中的每个条件,直到找到一个值为 TRUE 的条件,然后执行 THEN 子句中的相应 <命令>。如果没有一个条件为 TRUE,则执行 ELSE 子句中的 <命令>。如果不指定 ELSE 子句,并且没有一个条件为 TRUE,MySQL 将发出错误消息。

MySQL 不允许在 THEN 或 ELSE 子句中使用空的命令。 如果您不想处理 ELSE 子句中的逻辑,同时又要防止 MySQL 引发错误,则可以在 ELSE 子句中放置一个空的 BEGIN END 块。

示例用法

(1)使用可搜索的 CASE 函数根据当前日期的周索引,返回当前日期的中文星期名。如下:

mysql> select CASE
    -> WHEN (WEEKDAY(NOW()) = 0) THEN '星期一'
    -> WHEN (WEEKDAY(NOW()) = 1) THEN '星期二'
    -> WHEN (WEEKDAY(NOW()) = 2) THEN '星期三'
    -> WHEN (WEEKDAY(NOW()) = 3) THEN '星期四'
    -> WHEN (WEEKDAY(NOW()) = 4) THEN '星期五'
    -> WHEN (WEEKDAY(NOW()) = 5) THEN '星期六'
    -> WHEN (WEEKDAY(NOW()) = 6) THEN '星期天'
    -> ELSE '无效周索引'
    -> END AS CASE_VAL;
+----------+
| CASE_VAL |
+----------+
| 星期三   |
+----------+
1 row in set (0.04 sec)

由运行结果可知,上面示例可简单的CASE中的示例一样,只是使用了 CASE 函数的不同写法,WHEN 后面为表达式,当表达式的返回结果为 TRUE 时取 THEN 后面的值,如果都不是,则返回 ELSE 后面的值。

关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号