暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 流程控制函数

数据库杂货铺 2021-06-06
346
流程控制函数
 
名称
介绍
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  true 的结果。第二种语法返回第一个条件为 true 的结果。如果没有比较或没有条件为 true,则返回 ELSE 之后的结果,如果没有 ELSE 部分,则返回 NULL
 
注意
 
这里描述的 CASE 运算符的语法与 SQL CASE 语句中的语法略有不同,后者用于存储程序内部。CASE 语句不能有 ELSE NULL 子句,并且它以 END CASE 而不是 END 终止。
 
CASE 表达式结果的返回类型是所有结果值的聚合类型:
 
■ 如果所有类型都是数字,则聚合类型也是数字:
 
○ 如果至少有一个参数是双精度,则结果是双精度。
 
○ 否则,如果至少有一个参数是 DECIMAL,则结果是 DECIMAL 类型。
 
○ 否则,结果是整数类型(有一个例外):
 
● 如果所有整数类型都是有符号或无符号的,则结果是相同的符号,并且精度是所有指定整数类型(即 TINYINTSMALLINTMEDIUMINTINT BIGINT)中最高的。
 
● 如果存在有符号和无符号整数类型的组合,则结果是有符号的,精度可能更高。例如,如果类型是有符号 INT 和无符号 INT,则结果是有符号 BIGINT
 
● 例外情况是无符号 BIGINT 与任何有符号整数类型的组合。结果是 DECIMAL 类型,提供足够的数据长度,小数长度为 0
 
■ 如果所有类型都是 BIT,则结果是 BIT。否则,BIT 参数的处理类似于 BIGINT
 
■ 如果所有类型都是 YEAR,则结果是 YEAR。否则,YEAR 参数的处理类似于 INT
 
■ 如果所有类型都是字符串(CHAR VARCHAR),则结果是 VARCHAR,其最大长度由操作数的最长字符长度决定。
 
■ 如果所有类型都是字符或二进制字符串,则结果是 VARBINARY
 
■ SET ENUM 的处理方式类似于 VARCHAR;结果是 VARCHAR
 
■ 如果所有类型都是 JSON,那么结果就是 JSON
 
■ 如果所有类型都是时间类型,则结果是时间类型:
 
○ 如果所有时间类型都是 DATETIME TIMESTAMP,则结果分别是 DATETIME TIMESTAMP
 
○ 否则,如果混合使用时间类型,结果是 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)
     
    如果 expr1  TRUE (expr1 <> 0 and expr1 <> NULL)IF() 返回 expr2。否则,返回 expr3
     
    如果 expr2 expr3 中只有一个显式为 NULL,则 IF() 函数的结果类型为非 NULL 表达式的类型。
     
    IF() 的默认返回类型(当它存储到临时表中时可能会有影响)计算如下:
     
    ■ 如果 expr2  expr3 生成一个字符串,则结果是一个字符串。
     
    如果 expr2  expr3 都是字符串,则如果某个字符串区分大小写,则结果区分大小写。
     
    ■ 如果 expr2  expr3 生成浮点值,则结果为浮点值。
     
    ■ 如果 expr2  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'
         
        IFNULL(expr1,expr2) 的默认返回类型是这两个表达式中更通用的一个,按 STRINGREAL INTEGER 的顺序排列。考虑基于表达式生成的表,或 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 求值两次。
             
             
             
            官方文档:
            https://dev.mysql.com/doc/refman/8.0/en/flow-control-functions.html
            文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论