12.4 控制流功能

table12.6 流量控制运算符

NameDescription
CASECase operator
IF()If/else construct
IFNULL()空 if/else 构造
NULLIF()如果 expr1 = expr2,则返回 NULL

案例值 WHEN [compare_value] THEN 结果[WHEN [compare_value] THEN 结果...] [ELSE 结果] END

案例[条件] THEN 结果[条件[条件] THEN 结果...] [其他结果]结束

对于正确的第一个value=compare_value比较,第一个CASE语法返回* result *。第二种语法返回第一个条件为 true 的结果。如果没有比较或条件为真,则返回ELSE之后的结果,如果没有ELSE部分则返回NULL

Note

此处描述的CASE * expr *的语法与第 13.6.5.1 节“ CASE 语句”中描述的 SQL CASE * statement *的语法略有不同,供存储程序内部使用。 CASE语句不能包含ELSE NULL子句,并且以END CASE而不是END终止。

CASEtable 达式结果的返回类型是所有结果值的汇总类型。

mysql> SELECT CASE 1 WHEN 1 THEN 'one'
    ->     WHEN 2 THEN 'two' ELSE 'more' END;
        -> 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
        -> 'true'
mysql> SELECT CASE BINARY 'B'
    ->     WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
        -> NULL

IF(expr1,expr2,expr3)

如果* expr1 TRUE(expr1 <> 0expr1 <> NULL),则IF()返回 expr2 。否则,它返回 expr3 *。

Note

还有一个IF * statement *,与这里描述的IF() * function *不同。参见第 13.6.5.2 节“ IF 语句”

如果* expr2 expr3 *中只有一个是显式NULL,则IF()函数的结果类型为非NULLtable 达式的类型。

默认返回类型IF()(将其存储到临时 table 中时可能很重要)的计算如下:

  • 如果* expr2 expr3 *生成字符串,则结果为字符串。

如果* expr2 expr3 *都是字符串,则如果任一字符串区分大小写,则结果区分大小写。

  • 如果* expr2 expr3 *产生浮点值,则结果为浮点值。

  • 如果* expr2 expr3 *产生整数,则结果为整数。

mysql> SELECT IF(1>2,2,3);
        -> 3
mysql> SELECT IF(1<2,'yes','no');
        -> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
        -> 'no'

IFNULL(expr1,expr2)

如果* expr1 不是NULL,则IFNULL()返回 expr1 ;否则返回 expr2 *。

mysql> SELECT IFNULL(1,0);
        -> 1
mysql> SELECT IFNULL(NULL,10);
        -> 10
mysql> SELECT IFNULL(1/0,10);
        -> 10
mysql> SELECT IFNULL(1/0,'yes');
        -> 'yes'

默认返回类型IFNULL(expr1,expr2)是两个 table 达式中的“通用”值,按STRINGREALINTEGER的 Sequences 排列。考虑基于 table 达式的 table 的情况,或者 MySQL 必须在内部在临时 table 中存储IFNULL()返回的值:

mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
mysql> DESCRIBE tmp;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| test  | varbinary(4) | NO   |     |         |       |
+-------+--------------+------+-----+---------+-------+

在此的示例test列的类型为VARBINARY(4)(字符串类型)。

NULLIF(expr1,expr2)

如果expr1 = expr2为 true,则返回NULL,否则返回* expr1 *。这与EXPR1 = EXPR2 时为空,否则为空 EXPR1 结束相同。

返回值与第一个参数的类型相同。

mysql> SELECT NULLIF(1,1);
        -> NULL
mysql> SELECT NULLIF(1,2);
        -> 1

Note

如果参数不相等,则 MySQL 对* expr1 *进行两次评估。