[翻译]MySQL 文档: Control Flow Functions(控制流函数)
本文翻译自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. 第二种方式是返回首先遇到的 condition 为 true 时对应的 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)
如果 expr1 为 TRUE(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)
如果 expr2 或 expr3 中有一个类型为 NULL, 那么 IF() 函数的返回类型是另外一个非 NULL 表达式的类型.
IF() 默认返回值类型评定规则(在将数据存储到临时表时可能非常重要):
| 表达式 | 返回值类型 |
|---|---|
expr2 或 expr3 返回字符串 |
字符串 |
expr2 或 expr3 返回浮点数 |
浮点数 |
expr2 或 expr3 返回整型 |
整型 |
当 expr2 或 expr3 都是字符串时, 如果他们之中有一个是字符大小写敏感的, 那么返回类型也是大小写敏感的.
注意
除
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 会执行两次.
[翻译]MySQL 文档: Control Flow Functions(控制流函数)的更多相关文章
- 翻译qmake文档(三) Creating Project Files
翻译qmake文档 目录 原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html 创建项目文件 项目文件包含qmake构建你 ...
- 翻译qmake文档(一) qmake指南和概述
翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...
- 翻译qmake文档 目录
利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...
- 翻译qmake文档(四) Building Common Project Types
翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型 本章描述 ...
- 翻译qmake文档(二) Getting Started
翻译qmake文档 目录 原英文文档: http://qt-project.org/doc/qt-5/qmake-tutorial.html 本教程教讲授qmake基础知识.这个手册里 ...
- Google翻译PDF文档
Google翻译PDF文档 翻译软件虽多如牛毛,但有关整段/全文翻译,堪用的软件极少, 涉及专业技术的文献.胜任翻译工作的人力稀缺.少不了project师讴心沥血. 由于多是PDF格式.即使要翻译个概 ...
- sharepoint 2013 文档库eventhandle权限控制
记录一下如何在sharepoint server 2013文档库中,使用eventhandle控制文档库document library的条目item权限. ///<summary> // ...
- 自动化翻译ceph文档
需求很简单,翻译官网的操作文档 下载ceph代码luminous版本 这个只用来编译doc的,我们只需要最新的这个分支即可,拉最少的代码 git clone -b v12.2.13 --single- ...
- 项目总结11:Centos部署JDK+Tomcat+MySQL文档(阿里云-网易云-华为云)
(如果不是root登陆,则输入:sudo su - 切换成root) 1.JDK安装 1-1-yum update (升级所有包同时也升级软件和系统内核) --安装中会有提示输入y就好(两个y,中 ...
随机推荐
- 将数据缓存到sessionStorage中
//获取侧边栏 if (sessionStorage.getItem(`${env}${empId}leftMenu`)) { const leftMenu = JSON.parse(sessionS ...
- 0-Android使用Ashmem机制进行跨进程共享内存
Android使用Ashmem机制进行跨进程共享内存 来源: http://blog.csdn.net/luoshengyang/article/details/6651971 导语: 在Androi ...
- Object.keys(obj)
对象.keys 很明显是获得对象的key的一个数组 数组的key arr = ['a', 'b', 'c']; console.log(Object.keys(arr)); // console: [ ...
- 负载平衡(cogs 741)
«问题描述:G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运.«编程任务:对于给定的n 个环 ...
- Codevs 1159 最大全0子矩阵 悬线法!!!!
1159 最大全0子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O ...
- 搞定linux的中文输入和vim
本篇是http://blog.csdn.net/guochaoxxl/article/details/53212090的姊妹篇,无论先操作哪一篇都可以: 1.一言不合先下载,链接: https://p ...
- 让你的man手册显示与众不同
在~/.bashrc中加入如下代码: export LESS_TERMCAP_mb=$'\E[01;31m' export LESS_TERMCAP_md=$'\E[01;31m' export LE ...
- java中Map的entrySet 和keySet的使用
存储这样的一个数据关系结构 使用嵌套map存储 可以通过调用 entrySet方法 或者 keySet方法 进行迭代或者增强for循环 便利输出 这里演示 迭代器的方式进行遍历 package ...
- Codeforces 766E Mahmoud and a xor trip(树形DP)
题目链接 Mahmoud and a xor trip 树形DP.先考虑每个点到他本身的距离和,再算所有点两两距离和. 做的时候考虑二进制拆位即可. #include <bits/stdc++. ...
- 终极CRUD-3-用Jackson解析json
目录 1 jackson json基本介绍和使用 2 jackson 常用的注解 2.1@JsonProperty 2.2 @JsonIgnore 2.3 @JsonIgnoreProperties ...