• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 流量控制运算符

    流量控制运算符

    名称描述
    CASE案例运算符
    IF()如果/其他构造
    IFNULL()空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第一个比较结果为true。第二种语法返回第一个条件为true的结果。如果没有比较或条件为真,则返回after的结果,或者不存在任何结果。value=compare_valueELSENULLELSE

      注意

      此处描述的expr的语法与“ CASE语句”中描述的SQL 语句的语法略有不同,该语句在存储程序内部使用。该语句不能有子句,并且以代替。CASECASECASEELSE NULLEND CASEEND

      CASE表达式结果的返回类型是所有结果值的汇总类型:

      • 如果所有类型均为数字,则聚合类型也为数字:

        • 如果至少一个参数为双精度,则结果为双精度。
        • 否则,如果至少一个参数为DECIMAL,则结果为DECIMAL
        • 否则,结果为整数类型(一个例外):

          • 如果所有的整数类型都是有符号或无符号的所有的结果都是一样的符号和精度最高的所有指定整数类型的(即TINYINTSMALLINTMEDIUMINTINT,或BIGINT)。
          • 如果将有符号和无符号整数类型组合在一起,则结果将是有符号的,并且精度可能更高。例如,如果类型为带符号INT和无符号INT,则结果为带符号BIGINT
          • 该异常是无符号的,BIGINT与任何有符号的整数类型结合使用。结果DECIMAL具有足够的精度和小数位数为0。
      • 如果所有类型均为BIT,则结果为BIT。否则,BIT参数的处理类似于BIGINT
      • 如果所有类型均为YEAR,则结果为YEAR。否则,YEAR参数的处理类似于INT
      • 如果所有类型都是字符串(CHARVARCHAR),则结果的VARCHAR最大长度取决于操作数的最长字符长度。
      • 如果所有类型均为字符或二进制字符串,则结果为VARBINARY
      • SET并且ENUM被类似于对待VARCHAR;结果是VARCHAR
      • 如果所有类型均为JSON,则结果为JSON
      • 如果所有类型都是时间类型,则结果为时间类型:

        • 如果所有的时间类型DATETIME或者TIMESTAMP,其结果是DATETIMETIMESTAMP分别。
        • 否则,对于时间类型的混合,结果为DATETIME
      • 如果所有类型均为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)

      如果expr1is TRUEexpr1<> 0expr1<> NULL),则IF()返回expr2。否则,返回expr3

      注意

      还有一条语句,与此处描述的功能不同。请参见“ IF语句”。IFIF()

      如果expr2或中只有一个expr3NULL,则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'
      

      默认返回值类型是更为“一般”两个表达式的,顺序,或。考虑基于表达式的表的情况,或者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会计算两次。