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配合使用

有如下更新条件
1.工资5000以上的职员,工资减少10%。 2.工资在2000到4600之间的职员,工资增加15%
很容易考虑的是选择执行两次UPDATE语句,如下所示
--条件1 
UPDATE Personnel  SET salary = salary * 0.9  WHERE salary >= 5000; 
--条件2 
UPDATE Personnel  SET salary = salary * 1.15 
WHERE salary >= 2000 AND salary < 4600;

这个例子,其实很容易看出问题,因为这两个条件语句的执行是分开操作的,所以会出现抖动,就是说执行第一个条件后,他的工资变成了符合第二个条件的情况,则会再次被修改。

比如路人甲的工资是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的用法的更多相关文章

  1. SQL中的CASE WHEN用法

    其语法如下: 1)case vlaue when [compare-value]then reslut [when[compare-value]] then result ...] [else res ...

  2. 转载:SQL中的case when then else end用法

    SQL中的case when then else end用法 来源: http://www.cnblogs.com/prefect/p/5746624.html Case具有两种格式.简单Case函数 ...

  3. sql中对于case when...then...else...end的写法和理解

    查询配件主数据表(tbl_part_base_info)的所有数据和配件是否有物料(物料表(tbl_material)中有配件主数据表的part_no,就表示有物料,反之,则表示没有物料),用sql中 ...

  4. SQL中EXISTS和IN用法

    SQL中EXISTS的用法  指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...

  5. 转-sql中的case when的用法

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  6. SQL中的case when then else end用法

    --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' ...

  7. [转]SQL中的case when then else end用法

      Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' EN ...

  8. sql中的case when

    sql语言中有没有类似C语言中的switch case的语句?? 没有,用case   when   来代替就行了.            例如,下面的语句显示中文年月         select ...

  9. 你真的会玩SQL吗?Case的用法(转)

    今天来总结整理一下Case,因为SQL查询中用得最多的逻辑判断. Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' ...

随机推荐

  1. [转]Raft [Why Not Paxos]

    http://blog.csdn.net/cszhouwei/article/details/38374603 动画讲解 http://thesecretlivesofdata.com/raft/ W ...

  2. toLocaleString

  3. MySQL 添加列,修改列,删除列

    创建后表的修改 alter table 语句用于创建后对表的修改, 基础用法如下: 添加列 基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置]; 示例: 在表 ...

  4. Linux发行分支时间轴

    官网:http://futurist.se/gldt/ 全图png:http://futurist.se/gldt/wp-content/uploads/12.10/gldt1210.png 全图sv ...

  5. Myeclipse里导入jQuery.js 时出现错误打红叉的解决方法

    http://www.jb51.net/softjc/215710.html 解决方案:如上图所示:右击 jquery-2.1.1.min.js -->MyEclipse --> ①先点击 ...

  6. 转载:奇异值分解(SVD) --- 线性变换几何意义(上)

    本文转载自他人: PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理 ...

  7. Bootstrap部分---环境安装及一个可视化的布局;

    一:环境安装*****顺序不可变***** <head> 如果需要可以设定,移动设备优先 <meta name="viewport" content=" ...

  8. python 批量爬取代理ip

    import urllib.request import re import time import random def getResponse(url): req = urllib.request ...

  9. Codeforces Round #117 (Div. 2)

    Codeforces Round #117 (Div. 2) 代码 Codeforces Round #117 (Div. 2) A. Battlefield any trench in meters ...

  10. zookeeper的 目录加密

    import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.WatchedEvent;import org.apache.zo ...