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 '男' ...
随机推荐
- 重学STM32---(三) 中断分组和优先级
看了大半天,终于把原子哥的例程中的中断分组和优先级看懂了,勉勉强强知道了怎么设置中断分组和优先级,,不容易啊.下面就是我收集的资料及我的理解 分组不是很难,就是有一点知道就就全部明白了: // 设置N ...
- nginx+c+cgi开发
http://blog.csdn.net/marising/article/details/3932938 1.Nginx 1.1.安装 Nginx 的中文维基 http://wiki.codemon ...
- Day02_JAVA语言基础第二天
1.常量(理解) 1.概念 在程序运行过程中,其值不会发生改变的量 2.分类(掌握) A .字面值常量 整数常量:1,2,-3 小数常量:2.3,-232.3 字符常量:'A' 字符串 ...
- python 怎样使用安装库
win: 1.使用匹配安装 进入pip所在目录C:\Python27\Scripts pip intasll lxml 2.源码下载安装 下载源码,解压到任意目录 cd 进入到setup.py的目录 ...
- tablet 的使用
之前一直用jbrowse 发现有些信息展示的不准确,如浏览一个bam文件的比对情况.在某一位点,深度为1000,但是浏览器显示的小于1000,并且read也经常会缺少.所以果断放弃jbrowse,用 ...
- The Hidden Pitfalls of AsyncTask
http://logc.at/2011/11/08/the-hidden-pitfalls-of-asynctask/
- 解决:导入第三方jar包后,仍然出现java.lang.NoClassDefFoundError的错误
最近,在运行某个Android工程的时候,一直抛出java.lang.NoClassDefFoundError异常. 按照异常所给出的信息,应该是程序使用到的第三方jar包出了问题. 但是,这些第三方 ...
- C# Form 非法字符
头部加上 EnableEventValidation="false" ValidateRequest="false"
- ZOJ 1078 Palindrom Numbers
原题链接 题目大意:判断一个数是不是palindrom.不限于十进制,可以在任何进制下判断. 解法:还好,数字的范围不大,int类型足够搞定.方法就是从2进制开始,先把数字转换成2进制,判断是否对称, ...
- 工作中遇到的问题--JPA 一对多查询
/** * order by gs.updateDate desc * SELECT gs FROM GoodStatus gs WHERE gs IN( * @ ...