本文翻译自13.4 Control Flow Functions

Table 13.6 Flow Control Operators

名称 描述
CASE Case 运算符
IF() if/else
IFNULL() if/else 是否为 NULL
NULLIF 当 expr1 = expr2 时返回 NULL

CASE

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

第一种方式是当 value = compare_value 时返回 result. 第二种方式是返回首先遇到的 conditiontrue 时对应的 result. 如果未能匹配任何值, 当有ELSE 子句时, 将会返回与其对应的 result; 如果没有 ELSE 子句, 则会返回 NULL.

mysql> SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;
+------------------------------------------------------------+
| CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END |
+------------------------------------------------------------+
| one |
+------------------------------------------------------------+
1 row in set (0.00 sec) mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
+--------------------------------------------+
| CASE WHEN 1>0 THEN 'true' ELSE 'false' END |
+--------------------------------------------+
| true |
+--------------------------------------------+
1 row in set (0.00 sec) mysql> SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
+-----------------------------------------------------+
| CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END |
+-----------------------------------------------------+
| NULL |
+-----------------------------------------------------+
1 row in set (0.00 sec)

CASE 表达式能够返回任意类型的数据, 在实际使用中是依赖上下文中使用的数据类型. 例如在字符串上下文中, 返回的数据类型是字符串. 如果在数字上下文中, 返回的数据类型可能是 decimal, real, 或者 integer.

注意

这里的 CASE 函数 与存储过程中使用的 CASE 语句 有些轻微的不同(14.6.5.1 CASE 语法. CASE 语句 不能有 ELSE NULL 子句, 并且它以 END CASE 而不是 END 结尾.

IF(expr1, expr2, expr3)

如果 expr1TRUE(expr1 <> 0 and expr1 <> NULL), 则 IF() 函数将返回 expr2; 否则将返回 expr3. IF() 函数根据其上下文决定返回 数字字符串 类型的数据.

mysql> SELECT IF(1 > 2, 2, 3);
+-----------------+
| IF(1 > 2, 2, 3) |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec) mysql> SELECT IF(1 < 2, 'yes', 'no');
+------------------------+
| IF(1 < 2, 'yes', 'no') |
+------------------------+
| yes |
+------------------------+
1 row in set (0.00 sec) mysql> SELECT IF(STRCMP('test', 'test1'), 'no', 'yes');
+------------------------------------------+
| IF(STRCMP('test', 'test1'), 'no', 'yes') |
+------------------------------------------+
| no |
+------------------------------------------+
1 row in set (0.00 sec)

如果 expr2expr3 中有一个类型为 NULL, 那么 IF() 函数的返回类型是另外一个非 NULL 表达式的类型.

IF() 默认返回值类型评定规则(在将数据存储到临时表时可能非常重要):

表达式 返回值类型
expr2expr3 返回字符串 字符串
expr2expr3 返回浮点数 浮点数
expr2expr3 返回整型 整型

expr2expr3 都是字符串时, 如果他们之中有一个是字符大小写敏感的, 那么返回类型也是大小写敏感的.

注意

IF() 函数外, 还有一个 IF 语句, 详情请查阅 14.6.5.2 IF Syntax

IFNULL(expr1, expr2)

如果 expr1 不是 NULL, 那么 IFNULL() 返回 expr1, 否则返回 expr2. IFNULL() 根据上下文确定其返回数字或字符串.

mysql> SELECT IFNULL(1, 0);
+--------------+
| IFNULL(1, 0) |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec) mysql> SELECT IFNULL(NULL, 10);
+------------------+
| IFNULL(NULL, 10) |
+------------------+
| 10 |
+------------------+
1 row in set (0.00 sec) mysql> SELECT IFNULL(1/0, 10);
+-----------------+
| IFNULL(1/0, 10) |
+-----------------+
| 10.0000 |
+-----------------+
1 row in set (0.00 sec) mysql> SELECT IFNULL(1/0, 'yes');
+--------------------+
| IFNULL(1/0, 'yes') |
+--------------------+
| yes |
+--------------------+
1 row in set (0.00 sec)

IFNULL(expr1, expr2) 的默认返回值类型规则是非常 普通 的, 取值顺序是 STRING, REAL, INTEGER. 考虑当 IFNULL() 存在于创建新表时或 MySQL 必须创建临时表存储数据时:

mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> DESCRIBE tmp;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| test | varbinary(4) | NO | | | |
+-------+--------------+------+-----+---------+-------+
1 row in set (0.01 sec)

在这个示例中, test 列的类型是 VARBINARY(4).

NULLIF(expr1, expr2)

expr1 = expr2 为真时返回 NULL, 否则返回 expr1. 与 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END 等效.

mysql> SELECT NULLIF(1, 1);
+--------------+
| NULLIF(1, 1) |
+--------------+
| NULL |
+--------------+
1 row in set (0.00 sec) mysql> SELECT NULLIF(1, 2);
+--------------+
| NULLIF(1, 2) |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)

注意: 当两个参数值不相等时, expr1 会执行两次.

最新文章

  1. Linux 文件rwx权限问题 chmod 777 XXX 任何人拥有最高权限
  2. 数论 - 算数基本定理的运用 --- nefu 118 : n!后面有多少个0
  3. IT外包行业与职业发展
  4. 更改QTP默认测试脚本路径
  5. 在c++程序中执行DOS命令
  6. nginx url重写 rewrite实例
  7. datagridview添加复选框全选和取消
  8. React入门---组件嵌套-5
  9. JavaScript实现淡入淡出
  10. ioc(Inversion of Control)控制反转和DI
  11. springCloud系列教程01:Eureka 注册中心集群搭建
  12. python 爬虫 requests+BeautifulSoup 爬取巨潮资讯公司概况代码实例
  13. 【学习总结】Markdown 使用的正确姿势
  14. 6种原型设计工具大比对! Axure,Invision, 墨刀……哪款适合你?
  15. python属性查找 深入理解(attribute lookup)
  16. Jmeter+ant+Jenkins构建接口自动化测试
  17. Java-JUC(十):线程按序交替执行
  18. Mininet 系列实验(二)
  19. 模块sys, os, glob, pickle, subprocess常见用法
  20. 【转载】JAVA常见面试题及解答(精华)

热门文章

  1. tail /grep/more
  2. FreeBSD 用kgdb调试kernel dump文件
  3. js处理浮点数计算误差
  4. https总结
  5. input上传多张图片
  6. ES6箭头函数及模版字符串
  7. 【02】webpack 之 入门
  8. ios 上传视频或图片
  9. pat 团体天梯 L3-003. 社交集群
  10. 收藏一下这个微软MVP的老外博客