12.4 控制流功能
table12.6 流量控制运算符
Name | Description |
---|---|
CASE | Case 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
如果* expr1
是TRUE
(expr1 <> 0
和expr1 <> NULL
),则IF()返回 expr2
。否则,它返回 expr3
*。
Note
还有一个IF * statement *,与这里描述的IF() * function *不同。参见第 13.6.5.2 节“ IF 语句”。
如果* expr2
或 expr3
*中只有一个是显式NULL
,则IF()函数的结果类型为非NULL
table 达式的类型。
默认返回类型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'
如果* 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 达式中的“通用”值,按STRING
,REAL
或INTEGER
的 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)(字符串类型)。
如果expr1 = expr2
为 true,则返回NULL
,否则返回* expr1
*。这与EXPR1 = EXPR2 时为空,否则为空 EXPR1 结束相同。
返回值与第一个参数的类型相同。
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
Note
如果参数不相等,则 MySQL 对* expr1
*进行两次评估。