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表达式用法的更多相关文章

  1. SQL Server case表达式的用法

    ★CASE表达式是一个标量表达式,它基于条件逻辑来返回一个值.因为CASE是一个标量表达式,所以它可以应用在SELECT.WHERE.HAVING以及ORDER BY子句中. CASE表达式有两种格式 ...

  2. 神奇的 SQL 之 CASE表达式,妙用多多 !

    前言 历史考试选择题:黄花岗起义第一枪谁开的? A宋教仁 B孙中山 C黄兴 D徐锡麟,考生选C. 又看第二题:黄花岗起义第二枪谁开的? 考生傻了,就选了个B. 接着看第三题:黄花岗起义中,第三枪谁开的 ...

  3. 关于sql的case when用法简述

    刚入手公司项目,需要添加一个功能,用到了SQL的case when以及concat SELECT eve.cc, eve.sc, case concat(cc,sc) ' THEN '' ' THEN ...

  4. SQL中CASE 的用法 转载

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

  5. SQL之CASE WHEN用法详解[1]

    简单CASE WHEN函数: CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' E ...

  6. SQL之CASE WHEN用法详解(转)

    当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...

  7. sql语句-CASE WHEN用法详解

    当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...

  8. sql的case when用法

    select t.C_OPERATE_TIME MODIFY_TIME, t.c_code EMPLOYEE_CODE, t.c_name EMPLOYEE_NAME, CASE t.c_employ ...

  9. SQL之CASE WHEN用法详解

    原文链接:https://blog.csdn.net/rongtaoup/article/details/82183743 原文链接:https://www.cnblogs.com/zhuyeshen ...

随机推荐

  1. java 对象占用内存查看 以及JVM级别 方法修改等

    public interface Instrumentation 此类提供检测 Java 编程语言代码所需的服务.检测是向方法中添加字节码,以搜集各种工具所使用的数据.由于更改完全是进行添加,所以这些 ...

  2. python并发编程之多进程、多线程、异步和协程

    一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行.即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行 ...

  3. Ant自己主动编译打包&amp;公布 android项目

    Eclipse用起来尽管方便,可是编译打包android项目还是比較慢,尤其将应用打包公布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自己主动编译打包了 ...

  4. KPI、KPA、OKR三者的区别

    KPI.KPA或者OKR并不是水火不相容有你无我的概念,针对不对的业务状态.管理模式应该有所选择.以下是介绍它们之间的区别. 什么是KPI关键绩效指标 KPI(key performance indi ...

  5. Python学习笔记(二)在线用pip下载第三方包

    根据他人的博客,可以发现pip也是可以离线安装已经下载好的包的,具体请参考<pip常用命令>.由于现在还没进展到那个程度,所以本次博客先记录一下我已经学会的东西. 1.pip基本用法 (1 ...

  6. vue Element UI 导航高亮

    1. activeIndex 为默认高亮值,根据改变activeIndex的值来改变高亮的值 当页面改变的时候获取当前的路由地址,截取第一个 / 后面的值,就是当前的高亮值了 为什么要截取呢? 因为点 ...

  7. javax.servlet.ServletException: Could not resolve view with name‘ XXXX’in servlet with name 'spring'的解决方案-----SKY

    出现的异常如下: javax.servlet.ServletException: Could not resolve view with name '{"msg":"成功 ...

  8. android菜鸟学习笔记21----ContentProvider(一)ContentProvider的简单使用

    ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用.只有当需要在多个应用之间共享数据时才会用到ContentPro ...

  9. git reset和git revert

    1 git reset commit-id 直接回到某次提交,该次commit-id之后的提交都会被删除. --hard,将index和本地都恢复到指定的commit版本. 2 git revert ...

  10. ASP-Dictionary对象-基础用法

    1.存在 dim d set d=Server.CreateObject("Scripting.Dictionary") d.Add "c", "Ch ...