SQL的CASE表达式用法
case 表达式从SQL-92标准开始引入,因此是不依赖于具体的数据库技术,可提高SQL代码的可移植性。
case表达式注意事项:
1. 统一各个分支返回数据类型,并保证各个when字句的排他性,因为在发现为真的when字句时, case表达式真假值判断会终止,不会执行后边的判断;
2. 不要忘记写END;
3. 养成写ELSE字句的习惯,尽管不写ELSE语法并不会报错,但是如果前面条件不满足会返回NULL,有助于调试查找问题
case表达式常见用例:
1、用CHECK约束定义多个列的条件关系
比如规定公司男员工工资不得高于2000, 就可以写成
constriant check_salary check(case when sex = '' then
case when salary <= 2000 then 1
else 0 end
else 1 end =1)
不能写成逻辑与的关系 constraint check_salary check(sex = '2' and salary<= 2000),这样的话女性也不满足这个条件,无法被写入。
2、UPDATE字句进行调节分支
比如有需求将工资小于10000的调薪10%, 大于20000的降薪5%
| name | salary |
|---|---|
| June | 25000 |
| lucy | 9000 |
| sherry | 9800 |
| alina | 15000 |
如果你想用两个update,那就出错了,因为你会把salary给更新掉,一般情况会增加一个字段为调薪后字段,salary字段保持不变,但如果直接更新salary,就可以用case表达式
update Salaries set salary = case when salary <= 10000 then salary *1.1
when salary > 20000 then salary*0.95
else salary end;
注意最后的else字句千万不能丢,否则没有被捕获到的员工的工资会变为NULL
3、表之间数据匹配
有两张表,一张是课程表course,一张为每月开设的课程open_course
|
course_id |
course_name |
|---|---|
| 1 | 计算机网络 |
| 2 | 数据结构与算法 |
| 3 | 高性能MySQL |
| 4 | python核心编程 |
|
month_tab |
course_id |
|---|---|
| 201806 | 1 |
| 201806 | 3 |
| 201806 | 4 |
| 201807 | 4 |
| 201808 | 2 |
| 201808 | 4 |
Q3.1:将两张表转为交叉表,便于查看每月开设的课程
SQL1:
select course_name,
case when course_id in (
select course_id from sherry.openCourse where month_tab = '') then '〇'
else 'X' end as "6月",
case when course_id in (
select course_id from sherry.openCourse where month_tab = '') then '〇'
else 'X' end as "7月",
case when course_id in (
select course_id from sherry.openCourse where month_tab = '') then '〇'
else 'X' end as "8月"
from sherry.courseMaster

SQL2:
select month_tab,
case when max(case when course_id = 1 then 1 else 0 end) = 1 then '〇' else 'X' end as "计算机网络",
case when max(case when course_id = 2 then 1 else 0 end) = 1 then '〇' else 'X' end as "数据结构与算法",
case when max(case when course_id = 3 then 1 else 0 end) = 1 then '〇' else 'X' end as "高性能MySQL",
case when max(case when course_id = 4 then 1 else 0 end) = 1 then '〇' else 'X' end as "python核心编程"
from sherry.openCourse
group by month_tab
order by month_tab

4、将已有编号方式转换为新的方式并统计(聚合函数嵌套进case表达式)
Q4.1:比如查询某个城市男女分别有多少人,源表如下

select pre_name, sum(case when sex = 1 then population else 0 end) as "男", sum(case when sex = 2 then population else 0 end) as "女"
from sherry.popTbl2
group by pre_name

Q4.2:如果查询结果求每个地区共多少人
select case when pre_name in ('上海') then '华东地区'
when pre_name in ('北京') then '华北地区'
when pre_name in ('广州','深圳') then '华南地区'
end as area,
sum(population)
from sherry.popTbl2
group by case when pre_name in ('上海') then '华东地区'
when pre_name in ('北京') then '华北地区'
when pre_name in ('广州','深圳') then '华南地区'
end

注意group by 也要再写一遍,PostgreSQL可以直接写group by area,好像是因为在进行group by 操作前会先扫描一下select后面的字段。
5、聚合函数使用case表达式
仍然是源表sherry.popTbl2,如果把行结构数据转为列结构,即列为全国和各个地区,行为不同性别
select sex,sum(population) as "总和",sum(case when pre_name = '上海' then population else 0 end) as "上海",
sum(case when pre_name = '北京' then population else 0 end) as "北京",
sum(case when pre_name = '广州' then population else 0 end) as "广州",
sum(case when pre_name = '深圳' then population else 0 end) as "深圳"
from sherry.popTbl2
group by sex

6、order by字句使用case表达式
比如上述课程表course, 我们使用order by course_id, 则结果是1,2,3,4
Q6.1:但如果我们想结果为3,2,1,4呢,就可以用case表达式实现
select course_id from sherry.courseMaster
order by case when course_id = 3 then 1
when course_id = 2 then 2
when course_id = 1 then 3
when course_id = 4 then 4
end
参考:SQL进阶教程
SQL的CASE表达式用法的更多相关文章
- SQL Server case表达式的用法
★CASE表达式是一个标量表达式,它基于条件逻辑来返回一个值.因为CASE是一个标量表达式,所以它可以应用在SELECT.WHERE.HAVING以及ORDER BY子句中. CASE表达式有两种格式 ...
- 神奇的 SQL 之 CASE表达式,妙用多多 !
前言 历史考试选择题:黄花岗起义第一枪谁开的? A宋教仁 B孙中山 C黄兴 D徐锡麟,考生选C. 又看第二题:黄花岗起义第二枪谁开的? 考生傻了,就选了个B. 接着看第三题:黄花岗起义中,第三枪谁开的 ...
- 关于sql的case when用法简述
刚入手公司项目,需要添加一个功能,用到了SQL的case when以及concat SELECT eve.cc, eve.sc, case concat(cc,sc) ' THEN '' ' THEN ...
- SQL中CASE 的用法 转载
sql语言中有没有类似C语言中的switch case的语句?? 没有,用case when 来代替就行了. 例如,下面的语句显示中文年月 select getdat ...
- SQL之CASE WHEN用法详解[1]
简单CASE WHEN函数: CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' E ...
- SQL之CASE WHEN用法详解(转)
当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...
- sql语句-CASE WHEN用法详解
当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...
- sql的case when用法
select t.C_OPERATE_TIME MODIFY_TIME, t.c_code EMPLOYEE_CODE, t.c_name EMPLOYEE_NAME, CASE t.c_employ ...
- SQL之CASE WHEN用法详解
原文链接:https://blog.csdn.net/rongtaoup/article/details/82183743 原文链接:https://www.cnblogs.com/zhuyeshen ...
随机推荐
- 生成JNI的DLL时提示找不到jni.h的解决的方法Cannot open include file: 'jni.h': No such file or directory
解决的方法: 就是到jdk的安装文件夹下include下把下面对应的文件,拷贝到vc文件夹下的include文件夹下 \jdk\include\jni.h \jdk\include\win32\jaw ...
- python设置环境变量
方法1: 当程序开发完毕,就可以添加到 '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages'中 ...
- MySQL复制经常使用拓扑结构具体解释
复制的体系结构有下面一些基本原则: (1) 每一个slave仅仅能有一个master: (2) 每一个slave仅仅能有一个唯一的serverID: (3) 每一个master能够有 ...
- 笔试真题解析 ALBB-2015 算法project师实习生机试
1.用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. [解析] 计算N.下3进制结果末尾有多少个0,事实上就是计算3进制中的3被进位多少次,仅仅要 ...
- centos7.0 安装redis 3.2.9
wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar xzf redis-3.2.9.tar.gz cd redis-3.2.9 ...
- Linux入门基础(四)——磁盘管理
- db2数据库还原
1.建好数据库比如TEST,建的时候将codepage设为与目标备份的codepage一致,比如: 437 2.然后备份一下刚建好的数据库,备份成功后,将20141127目录删除,然后将原来备份好的 ...
- C#窗体互动
说白了就是在一个窗体操作另外一个窗体的东西. 原理是把form2的数据提取出来,利用中间的静态类middle来传递数据,触发事件,调用委托,来修正form1 效果如下: Form1.cs usin ...
- linux mount一个硬盘
我们在使用linux的情况下,难免有时会需要增加一块硬盘,在windows下增加硬盘很简单,所有的操作都是有画面.linux下增加一块硬盘,并且让这块硬盘可以正常的使用,所有的操作都在字符命令行的方式 ...
- awk substr()函数
awk 里的substr函数用法举例: 要截取要截取的内容1: F115!16201!1174113017250745 10.86.96.41 211.140.16.1 200703180718F12 ...