文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9MB
PDF (A4) - 40.0MB
手册页 (TGZ) - 258.5KB
手册页 (Zip) - 365.5KB
信息 (Gzip) - 4.0MB
信息 (Zip) - 4.0MB


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

14.5 流程控制函数

表 14.7 流程控制运算符

名称 描述
CASE Case 运算符
IF() If/else 结构
IFNULL() Null if/else 结构
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 与任何有符号整数类型组合。结果是具有足够精度和小数位数为 0 的 DECIMAL

    • 如果所有类型都是 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)

    如果 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 为 true,则返回 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 求值两次。

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