14.5 流程控制函数
-
CASEvalueWHENcompare_valueTHENresult[WHENcompare_valueTHENresult...] [ELSEresult] ENDCASE WHENconditionTHENresult[WHENconditionTHENresult...] [ELSEresult] END第一个
CASE语法返回第一个result对应的真值。第二个语法返回第一个条件为真的结果。如果没有比较或条件为真,返回ELSE后的结果,如果没有ELSE部分,则返回NULL。一个
CASE表达式的返回类型是所有结果值的聚合类型: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),expr1IS NOT NULLIF()返回expr2。否则,返回expr3。Note此外,还有一个
IF语句,它与这里描述的IF()函数不同。请参阅第15.6.5.2节,“IF 语句”。如果只有一个
expr2或expr3显式地是NULL,则IF()函数的结果类型为非NULL表达式的类型。IF() 函数的默认返回类型(可能在存储到临时表时很重要)如下计算:
-
如果
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)STRING、REAL或INTEGER。考虑到基于表达式的表或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 | | | | +-------+--------------+------+-----+---------+-------+在这个示例中,
test列的类型是VARBINARY(4)(字符串类型)。 -
如果
为真,则返回expr1=expr2NULL,否则返回expr1。这与CASE WHEN相同。expr1=expr2THEN NULL ELSEexpr1END返回值的类型与第一个参数相同。
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1Note如果参数不相等,MySQL 两次评估
expr1。
对于这些函数,如果第一个参数只包含第二个参数字符集和排序规则中的字符(且是常量),那么使用第二个字符集和排序规则来进行比较。系统变量值被处理为同样的字符集和排序规则。使用这些函数与系统变量的查询可能会因为非法混合排序而被拒绝。在这种情况下,您应该将系统变量强制转换到正确的字符集和排序规则。