Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

14.5 流程控制函数

表 14.7 流程控制操作符

Name Description
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语法返回第一个result对应的真值。第二个语法返回第一个条件为真的结果。如果没有比较或条件为真,返回ELSE后的结果,如果没有ELSE部分,则返回NULL

    Note

    这里描述的CASE 操作符语法与在CASE 语句描述的SQL语法不同,用于存储程序内部。该CASE 语句不能有ELSE NULL子句,并以END CASE而不是END终止。

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

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

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

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

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

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

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

        • 除非是无符号BIGINT与任何带符号整数类型的组合,否则结果是DECIMAL,精度和scale都是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 <> 0expr1 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 为真,则返回 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

对于这些函数,如果第一个参数只包含第二个参数字符集和排序规则中的字符(且是常量),那么使用第二个字符集和排序规则来进行比较。系统变量值被处理为同样的字符集和排序规则。使用这些函数与系统变量的查询可能会因为非法混合排序而被拒绝。在这种情况下,您应该将系统变量强制转换到正确的字符集和排序规则。