扩展 MySQL 8.0  / 第 6 章 向 MySQL 添加函数  /  12.5 流量控制函数

12.5 流量控制函数

表 12.7 流量控制运算符

姓名 描述
CASE 案例操作员
IF() 如果/否则构造
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第一个 为真的比较。第二种语法返回第一个条件为真的结果。如果没有比较或条件为真,则返回之后的结果,或者如果没有 部分。 value=compare_valueELSENULLELSE

    笔记

    此处描述的运算符 语法与第 13.6.5.1 节“CASE 语句”中描述的 用于存储程序的 SQL语句略有不同 。该 语句不能有 子句,它以而不是 终止。 CASE CASE CASEELSE NULLEND CASEEND

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

    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

    笔记

    还有一个statement,它与这里描述的 功能不同。请参阅 第 13.6.5.2 节,“IF 语句”IF IF()

    如果expr2or 中只有一个expr3是显式 NULL的,则函数的结果类型 IF()是非NULL表达式的类型。

    的默认返回类型IF() (当它存储到临时表中时可能很重要)计算如下:

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

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

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

    • 如果expr2or 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'
  • 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'

    的默认返回类型 是两个表达式中更通用的一个,顺序为、或。考虑基于表达式的表的情况,或者 MySQL 必须在临时表中内部存储返回值的情况: IFNULL(expr1,expr2)STRINGREALINTEGERIFNULL()

    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)

    NULL如果 为真则返回,否则 返回。这与 . expr1 = expr2expr1CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

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

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

    expr1如果参数不相等, MySQL 计算两次。