Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Functions and Operators  /  Flow Control Functions

14.5 流程控制函数

表 14.7 流程控制运算符

Name Description
CASE 情况运算符
IF() If/else 构造
IFNULL() 空If/else 构造
NULLIF() 如果 expr1 = expr2 则返回 NULL

  • CASE WHEN 比较值 THEN 结果 [WHEN 比较值 THEN 结果 ...] [ELSE 结果] END

    CASE WHEN 条件 THEN 结果 [WHEN 条件 THEN 结果 ...] [ELSE 结果] END

    第一个 CASE 语法返回第一个 =比较值 比较为真的结果。第二个语法返回第一个条件为真的结果。如果没有比较或条件为真,则返回 ELSE 之后的结果,或者如果没有 ELSE 部分,则返回 NULL

    Note

    这里描述的 CASE 运算符的语法与在存储程序中使用的 SQL CASE 语句的语法略有不同,见 第 15.6.5.1 节,“CASE 语句”。存储程序中的 CASE 语句不能有 ELSE NULL 子句,并以 END CASE 结束,而不是 END

    一个 CASE 表达式的结果类型是所有结果值的聚合类型:

    • 如果所有类型都是数字,则聚合类型也是数字:

      • 如果至少有一个参数是双精度的,则结果是双精度的。

      • 否则,如果至少有一个参数是 DECIMAL,则结果是 DECIMAL

      • 否则,结果是一个整数类型(有一种例外):

        • 如果所有整数类型都是 signed 或 unsigned 的,则结果是相同的符号和最高的整数类型(即 TINYINT, SMALLINT, MEDIUMINT, INTBIGINT)。

        • 如果存在有符号和无符号整数类型的组合,则结果是有符号的,精度可能更高。例如,如果类型是有符号的INT和无符号的INT,则结果是有符号的BIGINT

        • 唯一的例外是无符号BIGINT与任何有符号整数类型的组合。结果是DECIMAL,具有足够的精度和小数位0。

    • 如果所有类型都是BIT,则结果是BIT。否则,BIT参数被视为BIGINT

    • 如果所有类型都是YEAR,则结果是YEAR。否则,YEAR参数被视为INT

    • 如果所有类型都是字符字符串(CHARVARCHAR),则结果是VARCHAR,其最大长度由操作数的最长字符长度确定。

    • 如果所有类型都是字符或二进制字符串,则结果是VARBINARY

    • SETENUM被视为VARCHAR;结果是VARCHAR

    • 如果所有类型都是JSON,则结果是JSON

    • 如果所有类型都是时间类型,则结果是时间类型:

    • 如果所有类型都是GEOMETRY,则结果是GEOMETRY

    • 如果任何类型是BLOB,则结果是BLOB

    • 对于所有其他类型组合,结果是VARCHAR

    • 文字NULL操作数被忽略用于类型聚合。

    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
  • IF(expr1,expr2,expr3)

    如果 expr1TRUE (expr1 <> 0 并且 expr1 IS NOT NULL), IF() 返回 expr2。否则,它返回 expr3

    Note

    还有一个 IF 语句,它与这里描述的 IF() 函数不同。请参阅 第 15.6.5.2 节,“IF 语句”

    如果只有 expr2expr3 中的一个是明确的 NULL,则 IF() 函数的返回类型是非 NULL 表达式的类型。

    默认情况下,IF() 函数的返回类型(这可能在存储到临时表时很重要)是按照以下方式计算的:

    • 如果 expr2expr3 产生一个字符串,则结果是一个字符串。

      如果 expr2expr3 都是字符串,则结果是区分大小写的,如果任何一个字符串是区分大小写的。

    • 如果 expr2expr3 产生一个浮点值,则结果是一个浮点值。

    • 如果 expr2expr3 产生一个整数,则结果是一个整数。

    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'
  • IFNULL(expr1,expr2)

    如果 expr1 不是 NULLIFNULL() 返回 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) 的返回类型是两个表达式中更“通用”的类型,以 STRINGREALINTEGER 的顺序。考虑一个基于表达式的表或 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)(一个字符串类型)。

  • NULLIF(expr1,expr2)

    如果 expr1 = expr2 是 true,则返回 NULL,否则返回 expr1。这与 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END 相同。

    返回值的类型与第一个参数相同。

    mysql> SELECT NULLIF(1,1);
            -> NULL
    mysql> SELECT NULLIF(1,2);
            -> 1
    Note

    MySQL 如果参数不相等,则会对 expr1 进行两次评估。

对于这些函数,如果第一个参数仅包含第二个参数的字符集和排序规则中存在的字符(并且是常量),则使用第二个参数的字符集和排序规则来进行比较。系统变量值被视为同一字符集和排序规则的列值。在某些情况下,使用这些函数与系统变量的查询可能会被拒绝,错误信息为 Illegal mix of collations。在这种情况下,您应该将系统变量强制转换为正确的字符集和排序规则。