CASEvalueWHENcompare_valueTHENresult[WHENcompare_valueTHENresult...] [ELSEresult] ENDCASE WHENconditionTHENresult[WHENconditionTHENresult...] [ELSEresult] END第一个
CASE语法返回第一个比较为真的value=compare_valueresult。第二个语法返回第一个条件为真的结果。如果没有任何比较或条件为真,则返回ELSE后的结果,或者如果不存在ELSE部分则返回NULL。注意这里描述的
CASE运算符 的语法与在 第 15.6.5.1 节,“CASE 语句” 中描述的 SQLCASE语句 的语法略有不同,用于存储过程。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),则expr1IS NOT NULLIF()返回expr2。否则,它返回expr3。注意还有一个
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); -> 1注意如果参数不相等,MySQL 会对
expr1进行两次评估。
对于这些函数中的每一个,如果第一个参数只包含第二个参数使用的字符集和排序规则中存在的字符(并且它是一个常量),则使用后者的字符集和排序规则进行比较。系统变量值将作为具有相同字符和排序规则的列值处理。由于某些使用这些函数和系统变量的查询可能会因 非法排序规则混合 而被拒绝,因此在这种情况下,您应该将系统变量强制转换为正确的字符集和排序规则。