SQL 中 CASE 表达式的使用方式
作者:Wang1??????? 发布时间:2024-01-23 14:18:47
1. 前言
CASE 表达式是从 SQL-92 标准开始被引入的。
在 CASE 表达式里,可以使用 BETWEEN 、LIKE和 < 、> 等便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。
2. 语法
CASE 表达式有 简单 CASE 表达式(simple case expression) 和 搜索 CASE 表达式(searched case expression) 两种写法:
-- 简单CASE 表达式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'END
-- 搜索CASE 表达式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
sex
列(字段)如果是 '1' ,那么结果为男;如果是 '2' ,那么结果为女。
3. 注意点
CASE在匹配给定条件时,发现为真的 WHEN 子句时,CASE 表达式的真假值判断就会中止,而剩余的 WHEN 子句会被忽略。为了避免引起不必要的混乱,使用 WHEN 子句时要注意条件的排他性。
-- 例如,这样写的话,结果里不会出现“第二”
CASE WHEN col_1 IN ('a', 'b') THEN '第一'
WHEN col_1 IN ('a') THEN '第二'
ELSE '其他' END
统一各分支返回的数据类型: 一定要注意 CASE 表达式里各个分支返回的数据类型是否一致。某个分支返回字符型,而其他分支返回数值型的写法是不正确的。
不要忘了写 END: 不写END是语法错误,这是不允许的。
养成写 ELSE 子句的习惯: 与 END 不同,ELSE 子句是可选的,不写也不会出错。不写 ELSE 子句时,CASE 表达式的执行结果是 NULL 。
4. 分类汇总数据
SELECT
CASE pref_name
WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
END AS district,
SUM(population) AS total
FROM poptbl
GROUP BY
CASE pref_name
WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
END;
5. 一条SQL实现不同条件的统计
SELECT
pref_name AS '县名',
SUM( CASE WHEN sex=1 THEN population ELSE 0 END ) AS '男'
SUM( CASE WHEN sex=2 THEN population ELSE 0 END ) AS '女'
FROM poptlb
GROUP By pref_name
6. 使用CHECK约束定义多个列的条件关系
假设某公司规定“女性员工的工资必须在 20 万日元以下”,而在这个公司的人事表中,这条无理的规定是使用 CHECK 约束来描述的,代码如下所示:
CONSTRAINT check_salary CHECK (
CASE WHEN sex = '2' THEN
CASE WHEN salary <= 200000
THEN 1 ELSE 0 END
ELSE 1 END = 1
)
7. 在UPDATE语句中进行条件分支
条件:
对当前工资为 30 万日元以上的员工,降薪 10%。
对当前工资为 25 万日元以上且不满 28 万日元的员工,加薪 20%。
UPDATE Salaries
SET salary = CASE WHEN salary>300000 THEN salary*0.9
WHEN salary>=250000 AND salary <280000 THEN salary * 1.2
ELSE salary
END;
8. 生成交叉表
--- 使用IN谓词
SELECT
course_name AS '课程名',
CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200706')
THEN 'o'
ELSE 'x'
END AS '6 月'
CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200707')
THEN 'o'
ELSE 'x'
END AS '7 月'
CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200708')
THEN 'o'
ELSE 'x'
END AS '8 月'
FROM course_master;
--- 或者使用EXIST谓词
SELECT CM.course_name,
CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200706 AND OC.course_id = CM.course_id)
THEN '○' ELSE '×'
END AS "6 月",
CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200707 AND OC.course_id = CM.course_id)
THEN '○' ELSE '×'
END AS "7 月",
CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200708 AND OC.course_id = CM.course_id)
THEN '○' ELSE '×'
END AS "8 月"
FROM CourseMaster CM;
9. CASE表达式中使用聚合函数
对于加入了多个社团的学生,通过将其“主社团标志”列设置为 Y 或者 N 来表明哪一个社团是他的主社团;对于只加入了一个社团的学生,将其“主社团标志”列设置为 N。
现需要查询出所有学生加入的社团,若加入了多个则显示主社团
SELECT
std_id,
CASE WHEN COUNT(*)==1 THEN MAX(club_id)
ELSE MAX(CASE WHEN main_club_flg = 'Y' THEN club_id ELSE NULL END)
END AS 'main_club'
FROM student_club
GROUP BY std_id
10. 按照自定义规则排序列
按照mark列排序,要求修正a b c d 的权重为 c b a d
SELECT
mark
FROM
sort_test
ORDER BY
CASE mark
WHEN 'a' THEN -1
WHEN 'b' THEN 1
WHEN 'c' THEN 2
WHEN 'd' THEN -2
END
来源:https://juejin.cn/post/7142033761197096990
猜你喜欢
- 1 谈谈你对面向对象的理解?面向对象的编程---object oriented programming,简称:OOP,是一种编程的思想。OO
- 一、导入所需的库import randomimport cv2from matplotlib import pyplot as pltimp
- 我想此时不妨使用字符串参数来帮助我们解决这种情况,利用字符串分割的方法将一个参数分割成数个参数来解决。下面我们看一个例子: 假设现在给你一个
- 1.开发环境 vue+element2.电脑系统 windows 10 专业版3.在开发的过程中,我们总是会使用到 git管理代码!使用方法
- 1.主要用到 QFileDialog 方法打开本地文件2.界面打开前:打开后:3. 代码import sysfrom PyQt5 impor
- 本文实例讲述了Python实现爬取逐浪小说的方法。分享给大家供大家参考。具体分析如下:本人喜欢在网上看小说,一直使用的是小说下载阅读器,可以
- 引言什么是数据结构?数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说,数据结构就是设计数据
- 一起开发项目的时候总是要搭建环境和部署环境的,这个时候必须得有个python第三方包的list,一般都叫做requirements.txt。
- 如果你正从你的用户那里收集信息, 没有比网页表单更简单和直接的办法了。一份有良好设计的表单可以提供有价值的信息, 相反, 他们有可能把用户吓
- 在开发Web应用时,无一例外地需要访问数据库,以完成对数据的查询、插入、更新、删除等操作。受应用逻辑的影响,有时需要将多条数据库操作指令组成
- 本文代码来之《数据分析与挖掘实战》,在此基础上补充完善了一下~代码是基于SVM的分类器Python实现,原文章节题目和code关系不大,或者
- 由于个人能力有限,文章中难免会出现错误或遗漏的地方,敬请谅解!同时欢迎你指出,以便我能及时修改,以免误导下一个看官。最后希望本文能给你带来一
- 什么是错误页面?是指链接指向的网页现在失效了,原因可能是用户输错了地址,也可能是网站结构调整,内容删除,或者地址变更都有可能出现这种情况。那
- 1. 得到安全字符串,在查询中使用,过滤单引号。Function Get_SafeStr(str) &nb
- 最近被“模块化”缠身,又是文章又是PPT的,被逼着想了很多相关的东西。整理下我这段时间对于“模块化”的思考,大多都是我自己从事页面重构这份工
- 目录1.事件循环2.协程和异步编程2.1 基本使用2.2 await2.3 Task对象1.事件循环可以理解成为一个死循环,去检查任务列表中
- 一:背景以及项目结构介绍第一次将自己做的python爬虫项目打包成exe,搜了很多网上教程,大部分都是打包一个py文件的小demo,这里先给
- 导入模块模块通常为单独的.py文件,可以用import直接引用,可以作为模块的文件类型有.py、.pyo、.pyc、.pyd、.so、.dl
- etcd组件作为一个高可用强一致性的服务发现存储仓库.etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似
- HTTPX是Python3的功能齐全的HTTP客户端,它提供同步和异步API,并支持HTTP/1.1和HTTP/2安装pip install