CASE
value
WHENcompare_value
THENresult
[WHENcompare_value
THENresult
...] [ELSEresult
] ENDCASE WHEN
condition
THENresult
[WHENcondition
THENresult
...] [ELSEresult
] END第一个
CASE
语法返回result
第一个 为真的比较。第二种语法返回第一个条件为真的结果。如果没有比较或条件为真,则返回之后的结果,或者如果没有 部分。value
=compare_value
ELSE
NULL
ELSE
笔记此处描述的运算符 语法与第 13.6.5.1 节“CASE 语句”中描述的 用于存储程序的 SQL语句略有不同 。该 语句不能有 子句,它以而不是 终止。
CASE
CASE
CASE
ELSE NULL
END CASE
END
表达式结果的返回类型
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
),则expr1
IS NOT NULLIF()
返回expr2
。否则,它返回expr3
。笔记还有一个statement,它与这里描述的 功能不同。请参阅 第 13.6.5.2 节,“IF 语句”。
IF
IF()
如果
expr2
or 中只有一个expr3
是显式NULL
的,则函数的结果类型IF()
是非NULL
表达式的类型。的默认返回类型
IF()
(当它存储到临时表中时可能很重要)计算如下:如果
expr2
orexpr3
产生一个字符串,则结果是一个字符串。如果
expr2
和expr3
都是字符串,则如果任一字符串区分大小写,则结果区分大小写。如果
expr2
orexpr3
产生一个浮点值,则结果是一个浮点值。如果
expr2
orexpr3
产生一个整数,则结果是一个整数。
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'
的默认返回类型 是两个表达式中更“通用”的一个,顺序为、或。考虑基于表达式的表的情况,或者 MySQL 必须在临时表中内部存储返回值的情况:
IFNULL(
expr1
,expr2
)STRING
REAL
INTEGER
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)
(字符串类型)。NULL
如果 为真则返回,否则 返回。这与 .expr1
=expr2
expr1
CASE WHEN
expr1
=expr2
THEN NULL ELSEexpr1
END返回值与第一个参数具有相同的类型。
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
笔记expr1
如果参数不相等, MySQL 计算两次。
这些函数对系统变量值的处理在 MySQL 8.0.22 中发生了变化。对于这些函数中的每一个,如果第一个参数仅包含第二个参数使用的字符集和排序规则中存在的字符(并且它是常量),则使用后一个字符集和排序规则进行比较。在 MySQL 8.0.22 及更高版本中,系统变量值被处理为具有相同字符和排序规则的列值。一些将这些函数与先前成功的系统变量一起使用的查询随后可能会被Illegal mix of collations拒绝。在这种情况下,您应该将系统变量转换为正确的字符集和排序规则。