#### 13.6.5.1 案例声明

[](<>)

```
CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE
```

要么：

```
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE
```

这[`案子`](case.html)存储程序的语句实现了一个复杂的条件结构。

笔记

还有一个[`案子`](flow-control-functions.html#operator_case) *操作员*, 这不同于[`案子`](case.html) *陈述*描述here。看[第 12.5 节，“流控制功能”](flow-control-functions.html).这[`案子`](case.html)语句不能有`否则为空`子句，并以`结束案例`代替`结尾`.

对于第一种语法，*`案例值`*是一个表达式。该值与*`when_value`*每个中的表达`什么时候`子句，直到其中之一相等。当一个相等*`when_value`*找到了对应的`然后`条款*`声明列表`*执行。如果不*`when_value`*相等，则`别的`条款*`声明列表`*执行，如果有的话。

此语法不能用于测试与`空值`因为`空=空`是假的。看[第 3.3.4.6 节，“使用 NULL 值”](working-with-null.html).

对于第二种语法，每个`什么时候`条款*`搜索条件`*表达式被评估，直到一个为真，此时它对应的`然后`条款*`声明列表`*执行。如果不*`搜索条件`*相等，则`别的`条款*`声明列表`*执行，如果有的话。

如果不*`when_value`*要么*`搜索条件`*匹配的值测试和[`案子`](case.html)声明不包含`别的`子句，CASE 语句错误结果的 Case not found。

每个*`声明列表`*由一条或多条 SQL 语句组成；一个空的*`声明列表`*不允许。

处理任何值都不匹配的情况`什么时候`子句，使用`别的`包含一个空[`开始...结束`](begin-end.html)块，如本例所示。（此处使用的缩进`别的`条款只是为了清楚起见，并不重要。）

```
DELIMITER |

CREATE PROCEDURE p()
  BEGIN
    DECLARE v INT DEFAULT 1;

    CASE v
      WHEN 2 THEN SELECT v;
      WHEN 3 THEN SELECT 0;
      ELSE
        BEGIN
        END;
    END CASE;
  END;
  |
```
