● CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] ENDCASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END第一个 CASE 语法返回第一个 value=compare_value 为 true 的结果。第二种语法返回第一个条件为 true 的结果。如果没有比较或没有条件为 true,则返回 ELSE 之后的结果,如果没有 ELSE 部分,则返回 NULL。这里描述的 CASE 运算符的语法与 SQL CASE 语句中的语法略有不同,后者用于存储程序内部。CASE 语句不能有 ELSE NULL 子句,并且它以 END CASE 而不是 END 终止。CASE 表达式结果的返回类型是所有结果值的聚合类型:○ 否则,如果至少有一个参数是 DECIMAL,则结果是 DECIMAL 类型。● 如果所有整数类型都是有符号或无符号的,则结果是相同的符号,并且精度是所有指定整数类型(即 TINYINT、SMALLINT、MEDIUMINT、INT 或 BIGINT)中最高的。● 如果存在有符号和无符号整数类型的组合,则结果是有符号的,精度可能更高。例如,如果类型是有符号 INT 和无符号 INT,则结果是有符号 BIGINT。● 例外情况是无符号 BIGINT 与任何有符号整数类型的组合。结果是 DECIMAL 类型,提供足够的数据长度,小数长度为 0。■ 如果所有类型都是 BIT,则结果是 BIT。否则,BIT 参数的处理类似于 BIGINT。■ 如果所有类型都是 YEAR,则结果是 YEAR。否则,YEAR 参数的处理类似于 INT。■ 如果所有类型都是字符串(CHAR 或 VARCHAR),则结果是 VARCHAR,其最大长度由操作数的最长字符长度决定。■ 如果所有类型都是字符或二进制字符串,则结果是 VARBINARY。■ SET 和 ENUM 的处理方式类似于 VARCHAR;结果是 VARCHAR。■ 如果所有类型都是 JSON,那么结果就是 JSON。○ 如果所有时间类型都是 DATE、TIME 或 TIMESTAMP,则结果分别是 DATE、TIME 或 TIMESTAMP。○ 否则,如果混合使用时间类型,结果是 DATETIME。■ 如果所有类型都是 GEOMETRY,则结果是 GEOMETRY。■ 如果任何类型是 BLOB,则结果是 BLOB。■ 对于所有其他类型组合,结果是 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 为 TRUE (expr1 <> 0 and expr1 <> NULL),IF() 返回 expr2。否则,返回 expr3。如果 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 = expr2 为真,则返回 NULL,否则返回 expr1。这与 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END 相同。mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
如果参数不相等,MySQL 会对 expr1 求值两次。https://dev.mysql.com/doc/refman/8.0/en/flow-control-functions.html