文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  函数和运算符  /  流程控制函数

14.5 流程控制函数

表 14.7 流程控制运算符

名称 描述
CASE 情况运算符
IF() 如果/否则结构
IFNULL() 如果为 null/否则结构
NULLIF() 如果 expr1 = expr2 则返回 NULL

  • CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END

    CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END

    第一个 CASE 语法返回第一个 value=compare_value 比较为真的 result。第二个语法返回第一个条件为真的结果。如果没有任何比较或条件为真,则返回 ELSE 后的结果,或者如果不存在 ELSE 部分则返回 NULL

    注意

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

    CASE 表达式结果的返回类型是所有结果值的聚合类型

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

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

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

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

        • 如果所有整数类型都是有符号或都是无符号的,则结果具有相同的符号,精度是所有指定的整数类型中最高的 (即,TINYINTSMALLINTMEDIUMINTINTBIGINT).

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

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

    • 如果所有类型都是 BIT,则结果是 BIT。否则,BIT 参数与 BIGINT 相似。

    • 如果所有类型都是 YEAR,则结果是 YEAR。否则,YEAR 参数与 INT 相似。

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

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

    • SETENUMVARCHAR 相似;结果是 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)

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

    注意

    还有一个 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 不是 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) 的返回类型是两个表达式中更“通用”的表达式,按以下顺序: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 为真,则返回 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 进行两次评估。

对于这些函数中的每一个,如果第一个参数只包含第二个参数使用的字符集和排序规则中存在的字符(并且它是一个常量),则使用后者的字符集和排序规则进行比较。系统变量值将作为具有相同字符和排序规则的列值处理。由于某些使用这些函数和系统变量的查询可能会因 非法排序规则混合 而被拒绝,因此在这种情况下,您应该将系统变量强制转换为正确的字符集和排序规则。