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. MINIX3 导读分析

    一个操作系统的分析是属于一个非常庞大的工程,操作系统就像是一个人造的 人,每一个模块想完全发挥功效,很有可能需要很多模块的支持才能够实现.所 以在分析 MINIX3 时,我认为同时看多个模块对于理解 ...

  2. session 原理 数据结构

    [原创]转载请保留出处:shoru.cnblogs.com 晋哥哥的私房钱 引言 在web开发中,session是个非常重要的概念.在许多动态网站的开发者看来,session就是一个变量,而且其表现像 ...

  3. 用vs2008打开vs2012项目

    1 使用记事本打开*.sln解决方案文件,将Visual Studio 2012改为Visual Studio 2008 将版本号改为9.00 2 打开扩展名为*.csproj的项目文件,修改为 To ...

  4. Ubuntu14.04安装配置Open vSwitch

    最近在研究学习Open vSwitch,准备在本地Ubuntu14.04机器上安装一下,并基于其创建一些KVM虚拟机,下面就简要记录下在Ubuntu14.04系统上安装Open vSwitch的过程. ...

  5. 跟开涛老师学shiro -- shiro简介

    1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Securi ...

  6. Cocos2d-x游戏移植到Android平台

    1.所需环境支持:Android SDK.NDK.Eclipse.Cygwin.(本人所用系统WIN7-64位) (1)Cygwin的下载安装: Cygwin是Windows下的Linux模拟环境,用 ...

  7. tyvj 1049 最长不下降子序列 n^2/nlogn

    P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...

  8. html中不要忽略一些细节

    1. img必备和可选的参数都有写了上了,但是必备参数里的一个值alt没写(其实一些大型的专业门户网站其实也是有存在一些小问题的,只要我们细心一 点就能发现).虽然这样alt不写,在页面中也不会有任何 ...

  9. c 深度剖析 6

    函数的编码风格 1.注释 2,空行 3,缩进 4,参数长度,代码长度,语句长度要合适. 5,少用全局变量 6,指针仅作输入参数时,可用const 设置其为只读属性,避免其在函数中被修改. 7,函数默认 ...

  10. UVa 12100打印队列(队列)

    原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...