[翻译]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,中 ...
随机推荐
- 【VBA】随机数
[说明] 随机数.生成2个随机数m.n,取值范围为1~R.1~C Randomize m = )) + ) ' 1~R Random Int Randomize n = )) + ) ' 1~C Ra ...
- 将npm改成默认使用cnpm下载
淘宝的cnpm下载安装的命令为 npm install -g cnpm --registry=https://registry.npm.taobao.org 但是仅仅这样是不够的,这样只有主动去下载资 ...
- HTML 对空行和空格进行控制
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- HTML 上标和下标
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- POJ3170 Bzoj1671 [Usaco2005 Dec]Knights of Ni 骑士
1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 281 Solved: 180 ...
- javaScript防止拦截新窗口打开页面
原文发布时间为:2009-05-04 -- 来源于本人的百度文章 [由搬家工具导入] 兼容IE.FF.GOOGLE。防止拦截。。。。 <html xmlns="http://www.w ...
- mysql启动错误1067的解决
安装后MYSQL5后,发现启动出错,有时启动正常,但加接时马上出错. 出错代码:1067 解决办法如下: 删除%windows%/my.ini 删除其它地方的my.ini 在mysql安装 ...
- 介绍一款可以滚动加载的插件droploader
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 嵌入式 Linux线程锁详解pthread_mutexattr_t【转】
转自:http://blog.sina.com.cn/s/blog_8795b0970101il6g.html 在Posix Thread中定义有一套专门用于线程同步的mutex函数. . 创建和销毁 ...
- IIS 发布双证书
1.端口都用443 2.配置主机名 3.勾选需要服务器名称指示