本文翻译自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

  1. CASE value WHEN [compare_value] THEN result
  2. [WHEN [compare_value] THEN result ...]
  3. [ELSE result]
  4. END
  5. CASE WHEN [condition] THEN result
  6. [WHEN [condition] THEN result ...]
  7. [ELSE result]
  8. END

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

  1. mysql> SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;
  2. +------------------------------------------------------------+
  3. | CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END |
  4. +------------------------------------------------------------+
  5. | one |
  6. +------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
  9. +--------------------------------------------+
  10. | CASE WHEN 1>0 THEN 'true' ELSE 'false' END |
  11. +--------------------------------------------+
  12. | true |
  13. +--------------------------------------------+
  14. 1 row in set (0.00 sec)
  15. mysql> SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
  16. +-----------------------------------------------------+
  17. | CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END |
  18. +-----------------------------------------------------+
  19. | NULL |
  20. +-----------------------------------------------------+
  21. 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() 函数根据其上下文决定返回 数字字符串 类型的数据.

  1. mysql> SELECT IF(1 > 2, 2, 3);
  2. +-----------------+
  3. | IF(1 > 2, 2, 3) |
  4. +-----------------+
  5. | 3 |
  6. +-----------------+
  7. 1 row in set (0.00 sec)
  8. mysql> SELECT IF(1 < 2, 'yes', 'no');
  9. +------------------------+
  10. | IF(1 < 2, 'yes', 'no') |
  11. +------------------------+
  12. | yes |
  13. +------------------------+
  14. 1 row in set (0.00 sec)
  15. mysql> SELECT IF(STRCMP('test', 'test1'), 'no', 'yes');
  16. +------------------------------------------+
  17. | IF(STRCMP('test', 'test1'), 'no', 'yes') |
  18. +------------------------------------------+
  19. | no |
  20. +------------------------------------------+
  21. 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() 根据上下文确定其返回数字或字符串.

  1. mysql> SELECT IFNULL(1, 0);
  2. +--------------+
  3. | IFNULL(1, 0) |
  4. +--------------+
  5. | 1 |
  6. +--------------+
  7. 1 row in set (0.00 sec)
  8. mysql> SELECT IFNULL(NULL, 10);
  9. +------------------+
  10. | IFNULL(NULL, 10) |
  11. +------------------+
  12. | 10 |
  13. +------------------+
  14. 1 row in set (0.00 sec)
  15. mysql> SELECT IFNULL(1/0, 10);
  16. +-----------------+
  17. | IFNULL(1/0, 10) |
  18. +-----------------+
  19. | 10.0000 |
  20. +-----------------+
  21. 1 row in set (0.00 sec)
  22. mysql> SELECT IFNULL(1/0, 'yes');
  23. +--------------------+
  24. | IFNULL(1/0, 'yes') |
  25. +--------------------+
  26. | yes |
  27. +--------------------+
  28. 1 row in set (0.00 sec)

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

  1. mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
  2. Query OK, 1 row affected (0.05 sec)
  3. Records: 1 Duplicates: 0 Warnings: 0
  4. mysql> DESCRIBE tmp;
  5. +-------+--------------+------+-----+---------+-------+
  6. | Field | Type | Null | Key | Default | Extra |
  7. +-------+--------------+------+-----+---------+-------+
  8. | test | varbinary(4) | NO | | | |
  9. +-------+--------------+------+-----+---------+-------+
  10. 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 等效.

  1. mysql> SELECT NULLIF(1, 1);
  2. +--------------+
  3. | NULLIF(1, 1) |
  4. +--------------+
  5. | NULL |
  6. +--------------+
  7. 1 row in set (0.00 sec)
  8. mysql> SELECT NULLIF(1, 2);
  9. +--------------+
  10. | NULLIF(1, 2) |
  11. +--------------+
  12. | 1 |
  13. +--------------+
  14. 1 row in set (0.00 sec)

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

[翻译]MySQL 文档: Control Flow Functions(控制流函数)的更多相关文章

  1. 翻译qmake文档(三) Creating Project Files

    翻译qmake文档 目录   原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html   创建项目文件 项目文件包含qmake构建你 ...

  2. 翻译qmake文档(一) qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

  3. 翻译qmake文档 目录

    利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...

  4. 翻译qmake文档(四) Building Common Project Types

    翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型        本章描述 ...

  5. 翻译qmake文档(二) Getting Started

    翻译qmake文档 目录 原英文文档: http://qt-project.org/doc/qt-5/qmake-tutorial.html         本教程教讲授qmake基础知识.这个手册里 ...

  6. Google翻译PDF文档

    Google翻译PDF文档 翻译软件虽多如牛毛,但有关整段/全文翻译,堪用的软件极少, 涉及专业技术的文献.胜任翻译工作的人力稀缺.少不了project师讴心沥血. 由于多是PDF格式.即使要翻译个概 ...

  7. sharepoint 2013 文档库eventhandle权限控制

    记录一下如何在sharepoint server 2013文档库中,使用eventhandle控制文档库document library的条目item权限. ///<summary> // ...

  8. 自动化翻译ceph文档

    需求很简单,翻译官网的操作文档 下载ceph代码luminous版本 这个只用来编译doc的,我们只需要最新的这个分支即可,拉最少的代码 git clone -b v12.2.13 --single- ...

  9. 项目总结11:Centos部署JDK+Tomcat+MySQL文档(阿里云-网易云-华为云)

      (如果不是root登陆,则输入:sudo su - 切换成root) 1.JDK安装 1-1-yum update (升级所有包同时也升级软件和系统内核) --安装中会有提示输入y就好(两个y,中 ...

随机推荐

  1. Log4j官方文档翻译(四、如何在java中输出日志消息)

    我们已经创建来配置文件,本章详细的介绍下如何生成调试信息,并把他们转化成文本文件. 基本的例子 下面就是创建的一个基本的例子: log4j.properties的内容为: log = /usr/hom ...

  2. 【bzoj4127】Abs 树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  3. [HNOI2014][bzoj3572] 世界树 [虚树+dp]

    题面: 传送门 思路: 一道虚树的好题,是很多虚树博客的入门题目 但是我认为这道题目出的难点和亮点不在于虚树,而在于建出虚树以后dp的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ...

  4. BZOJ2395 [Balkan 2011]Timeismoney 【最小乘积生成树】

    题目链接 BZOJ2395 题意:无向图中每条边有两种权值,定义一个生成树的权值为两种权值各自的和的积 求权值最小的生成树 题解 如果我们将一个生成树的权值看做坐标,那么每一个生成树就对应一个二维平面 ...

  5. caffe+Ubuntu14.04.10 +cuda7.0/7.5+CuDNNv4 安装

    特别说明: Caffe 官网地址:http://caffe.berkeleyvision.org/ 本文为作者亲自实验完成,但仅限用于学术交流使用,使用本指南造成的任何不良后果由使用者自行承担,与本文 ...

  6. python常用内建函数

    1.input 读取控制台的输入,输出的是字符串 2.enumerate 遍历数组的时候,能够将index 和item同时返回,返回的每一项包含index,item 3.isinstance(obje ...

  7. 平滑升级nginx

    平滑升级nginx版本技术文档 作者 联系方式 日期 版本号 马坤 852115346@qq.com 2017-12-31 V1.0.0 备注:作者水平有限,难免出现错误.如若发现错误,请您及时与作者 ...

  8. HTML 删除和添加字

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. How Many to Be Happy?

    How Many to Be Happy? 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Let G be a connected simple undirected graph wh ...

  10. Cryptography I 学习笔记 --- 总结

    在b站上大概的看完了Dan Boneh的密码学,对现代密码学总算有了一个粗浅的认识. 总算能在纸上手写RSA公式并且证明之了,蛤蛤. 总体的感触就是,现代密码学是一个非常博大精深的体系,我等程序员最重 ...