# 12.5 流量控制功能
表 12.7 流量控制运算符
姓名 | 描述 |
---|---|
案子 | 案例操作员 |
如果() | if/else 构造 |
IFNULL() | 空 if/else 构造 |
NULLIF() | 如果 expr1 = expr2 返回 NULL |
-
案子 *
价值* 什么时候 *
比较值* 然后 *
结果* [什么时候 *
比较值* 然后 *
结果* ...] [别的 *
结果*] 结尾
案例 *
健康)状况* 然后 *
结果* [什么时候 *
健康)状况* 然后 *
结果* ...] [别的 *
结果*] 结尾
首先
案子
语法返回*结果
*为了第一*
价值*=*
比较值*
比较是真的。第二种语法返回第一个条件为真的结果。如果没有比较或条件为真,则后面的结果别的
被退回,或空值
如果没有别的
部分。笔记
的语法
案子
操作员这里描述的与 SQL 略有不同案子
陈述描述于第 13.6.5.1 节,“CASE 声明”,用于在存储的程序中使用。这案子
语句不能有否则为空
子句,并以结束案例
代替结尾
.a的返回类型
案子
表达式结果是所有结果值的聚合类型:如果所有类型都是数字,则聚合类型也是数字:
如果所有类型都是字符或二进制字符串,则结果为
变量
.如果所有类型都是时间的,则结果是时间的:
如果所有类型都是
几何学
,结果是几何学
.对于所有其他类型组合,结果是
VARCHAR
.文字
空值
类型聚合忽略操作数。
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
是真的
(*
expr1* <> 0
和*
expr1* 不为空
),如果()
返回expr2
.否则,它返回expr3
*.笔记
还有一个
如果
陈述, 这不同于如果()
功能描述here。看第 13.6.5.2 节,“IF 语句”.如果只有其中之一*
expr2
要么expr3
*是明确的空值
, 结果类型如果()
函数是非的类型空值
表达。默认返回类型
如果()
(当它存储到临时表中时可能很重要)计算如下:如果*
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
不是空值
,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'
默认返回类型
如果空(*
expr1*,*
expr2*)
是两个表达式中更“一般”的一个,按顺序排列细绳
,真实的
, 要么整数
.考虑基于表达式的表或 MySQL 必须在内部存储由IFNULL()
在临时表中:mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test; mysql> DESCRIBE tmp; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | test | varbinary(4) | NO | | | | +-------+--------------+------+-----+---------+-------+
在本例中,类型
测试
列是VARBINARY(4)
(字符串类型)。 -
退货
空值
如果*
expr1* = *
expr2*
为真,否则返回*expr1
*.这与案例 *
expr1* = *
expr2* 否则为空 *
expr1* 结尾
.返回值与第一个参数具有相同的类型。
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
笔记
MySQL 评估*
expr1
*如果参数不相等则两次。这些函数对系统变量值的处理在 MySQL 8.0.22 中发生了变化。对于这些函数中的每一个,如果第一个参数仅包含第二个参数使用的字符集和排序规则中存在的字符(并且它是常量),则使用后一个字符集和排序规则进行比较。在 MySQL 8.0.22 及更高版本中,系统变量值被处理为相同字符和排序规则的列值。使用这些函数和以前成功的系统变量的一些查询随后可能会因非法混合排序规则而被拒绝。在这种情况下,您应该将系统变量转换为正确的字符集和排序规则。