SQL中的CASE的用法
CASE在SQL语句中,很有点类似java等高级编程语言中的switch这样子的多分枝语句,但是有点不同的是,case后面接的是when,另外,when的后续分枝有点类似if后面接else。这个是我的个人认识,case 。。when。。then。。[else]。。
下面,看看MySQL的帮助信息,可以看到case的基本语法结构:
topics: #CASE的两种基本用法
CASE OPERATOR
CASE STATEMENT MariaDB [mysql]> help case statement; #case的第一种用法
Name: 'CASE STATEMENT'
Description:
Syntax:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE Or: CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE MariaDB [mysql]> help case operator; #case的第二种基本用法
Name: 'CASE OPERATOR'
Description:
Syntax:
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可以和select,check,update等一起配合使用,相当于增加了SQL操作的条件分析,是的SQL写的可以更加强大。
1. select的配合用法
Examples:
MariaDB> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
-> 'one'
MariaDB> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
-> 'true'
MariaDB> SELECT CASE BINARY 'B'
-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
-> NULL
MariaDB [test]> select * from casetbl;
+----+------+---------+---------+--------+
| id | age | name | country | salary |
+----+------+---------+---------+--------+
| 1 | 33 | shihuc | china | 1000 |
| 2 | 34 | water | china | 2000 |
| 3 | 20 | taikang | america | 3000 |
| 4 | 50 | amazon | america | 5000 |
+----+------+---------+---------+--------+
4 rows in set (0.00 sec) MariaDB [test]> SELECT
-> CASE WHEN salary <= 2000 THEN '1'
-> WHEN salary > 2000 AND salary <= 4000 THEN '2'
-> ELSE NULL END salary_class,
-> COUNT(*) FROM casetbl
-> GROUP BY
-> CASE WHEN salary <= 2000 THEN '1'
-> WHEN salary > 2000 AND salary <= 4000 THEN '2'
-> ELSE NULL END;
+--------------+----------+
| salary_class | COUNT(*) |
+--------------+----------+
| NULL | 1 |
| 1 | 2 |
| 2 | 1 |
+--------------+----------+
3 rows in set (0.00 sec)
2. check的配合用法
比如,某些公司对于男性员工招聘的时候有年龄的限制,年龄必须小于40岁,当数据插入到表中的时候,这个年龄就会自动被检查。
MariaDB [test]> create table casechktbl(
-> id int primary key auto_increment,
-> age int not null,
-> name varchar(30),
-> salary int (5) check (case when age > 35 then 1 else 0 end));
Query OK, 0 rows affected (0.25 sec) MariaDB [test]> desc casechktbl;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| age | int(11) | NO | | NULL | |
| name | varchar(30) | YES | | NULL | |
| salary | int(5) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.03 sec) MariaDB [test]> insert into casechktbl (name, age, salary) values("hailang", 36, 10);
Query OK, 1 row affected (0.04 sec) MariaDB [test]> select * from casechktbl;
+----+-----+---------+--------+
| id | age | name | salary |
+----+-----+---------+--------+
| 1 | 36 | hailang | 10 |
+----+-----+---------+--------+
1 row in set (0.00 sec)
这里需要说明的是,这个测试是在MySQL下进行的,这个例子可能看不出什么问题,因为MySQL中的check其实是一个摆设,不起重要(当用于约束的时候)。
3. update配合使用
这个例子,其实很容易看出问题,因为这两个条件语句的执行是分开操作的,所以会出现抖动,就是说执行第一个条件后,他的工资变成了符合第二个条件的情况,则会再次被修改。
比如路人甲的工资是5000,执行第一个修改后,变成了4500,很显然这个水平符合第二个条件,就是要增长10%,则最终其工资为5175.他这么一调整,工资不降反增了。。。
所以,需要用case条件来处理。
MariaDB [test]> select * from casetbl;
+----+------+---------+---------+--------+
| id | age | name | country | salary |
+----+------+---------+---------+--------+
| 1 | 33 | shihuc | china | 1000 |
| 2 | 34 | water | china | 2000 |
| 3 | 20 | taikang | america | 3000 |
| 4 | 50 | amazon | america | 5000 |
| 5 | 37 | hailang | germany | 5000 |
+----+------+---------+---------+--------+
5 rows in set (0.00 sec) MariaDB [test]> update casetbl set salary =
-> case when salary >= 5000 then salary * 0.9
-> when salary >=2000 and salary <4600 then salary * 1.15
-> else salary end;
Query OK, 4 rows affected (0.05 sec)
Rows matched: 5 Changed: 4 Warnings: 0 MariaDB [test]>
MariaDB [test]> select * from casetbl;
+----+------+---------+---------+--------+
| id | age | name | country | salary |
+----+------+---------+---------+--------+
| 1 | 33 | shihuc | china | 1000 |
| 2 | 34 | water | china | 2300 |
| 3 | 20 | taikang | america | 3450 |
| 4 | 50 | amazon | america | 4500 |
| 5 | 37 | hailang | germany | 4500 |
+----+------+---------+---------+--------+
5 rows in set (0.00 sec)
从上面的结果,是不是很容易看出结果是符合逻辑的。
SQL中的CASE的用法的更多相关文章
- SQL中的CASE WHEN用法
其语法如下: 1)case vlaue when [compare-value]then reslut [when[compare-value]] then result ...] [else res ...
- 转载:SQL中的case when then else end用法
SQL中的case when then else end用法 来源: http://www.cnblogs.com/prefect/p/5746624.html Case具有两种格式.简单Case函数 ...
- sql中对于case when...then...else...end的写法和理解
查询配件主数据表(tbl_part_base_info)的所有数据和配件是否有物料(物料表(tbl_material)中有配件主数据表的part_no,就表示有物料,反之,则表示没有物料),用sql中 ...
- SQL中EXISTS和IN用法
SQL中EXISTS的用法 指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...
- 转-sql中的case when的用法
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- SQL中的case when then else end用法
--简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' ...
- [转]SQL中的case when then else end用法
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' EN ...
- sql中的case when
sql语言中有没有类似C语言中的switch case的语句?? 没有,用case when 来代替就行了. 例如,下面的语句显示中文年月 select ...
- 你真的会玩SQL吗?Case的用法(转)
今天来总结整理一下Case,因为SQL查询中用得最多的逻辑判断. Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' ...
随机推荐
- 如何将character_set_database latin1 改为 gbk(转)
第一篇文章: 原地址: Linux服务器下文件名为 my.cnf Windows 下文件名为 my.ini 问题:通过sql语言向数据库中添加中文的数据的时候,查询是显示的是乱码. 原因:当初安装数据 ...
- RelativeLayout相对布局
RelativeLayout相对布局常用属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_center ...
- java常见类型的转化以及风险
呵呵呵 参考:http://zhangyuefeng1983.blog.163.com/blog/static/1083372520126693524870/
- MongoDB国内学术研究(部分)
1.<MongoDB在煤炭行业GIS数据存储方面的应用> mongoDB的技术介绍占到了文章的60%,剩下的还能说些啥呢,呵呵. 2.<基于MongoDB的矢量空间数据云存储与处理系 ...
- (实用篇)PHP页面跳转到另一个页面的方法总结
一.用HTTP头信息 也就是用PHP的header函数.PHP里的header函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,例如声明返回信息的类型("C ...
- 无法Ping通windows 7主机
今天在使用Filezilla FTP_SERVER新建了一个windows主机上的FTP服务器. 建立完成之后,从MAC上无法进行连接也甚至连主机也无法连接,怀疑是防火墙的问题. 网上一搜确实是,但是 ...
- Codeforces Round #298 (Div. 2) B. Covered Path
题目大意: 一辆车,每秒内的速度恒定...第I秒到第I+1秒的速度变化不超过D.初始速度为V1,末速度为V2,经过时间t,问最远能走多远. 分析 开始的时候想麻烦了.讨论了各种情况.后来发现每个时刻的 ...
- spring ioc 原理 spring aop原理
大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...
- activiti 任务节点 处理人设置【转】
转自http://blog.csdn.net/qq_30739519/article/details/51225067 1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自 ...
- JavaWeb学习记录(四)——日期和数字的格式转换
一.Date转为String (1) public class DateUtil { private static SimpleDateFormat sdf = new SimpleDateFo ...