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.OUPUT参数返回值CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@
- 一、Scrapy框架简介Scrapy是用纯Python实现一个为了爬取网站数据,提取结构性数据而编写的应用框架,用途非常广泛。利用框架,用户
- 项目测试对于一个项目的重要性,大家应该都知道吧,写python的朋友,应该都写过自动化测试脚本。最近正好负责公司项目中的api测试,下面写了
- 使用matplotlib绘图时,在弹出的窗口中默认是有工具栏的,那么这些工具栏是如何定义的呢?工具栏的三种模式matplotlib的基础配置
- 实现效果:方法一:1 print "+"+"-"*8+"+"+"-&q
- 索引初识最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。CREATE TABLE mytable
- explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间
- 本文实例为大家分享了梅尔倒谱系数实现代码,供大家参考,具体内容如下""" @author: zoutai@fi
- 当设计一个产品,其中很多地方要把日期类型保存到数据库中,如果产品有兼容不同数据库产品的需求,那么,应当怎样设计呢?当然,首先想到的是,使用数
- 导言在前面的教程我们看到了如何使用两个页面(一个主页,用于列出供应商; 一个明细页,用于显示选定供应商提供的产品)创建主/从报表 . 这种两
- 如何创建列表,或生成列表。这里介绍在python的基础知识里创建或转变或生成列表的一些方法。零个,一个或一系列数据用逗号隔开,放在方括号[
- python 连接数据库操作, 方法如下:在本机的mysql 数据库中有一个名为yao的库,其中有一个名为user的表,表中的内容如图下面,
- 一、数据插入思路如果一条一条插入普通表的话,效率太低下,但内存表插入速度是很快的,可以先建立一张内存表,插入数据后,在导入到普通表中。1、创
- 一、handlers是什么?logging模块中包含的类用来自定义日志对象的规则(比如:设置日志输出格式、等级等)常用3个子类:Stream
- 导语元宵节,又称上元节、灯节,是春节之后的第一个重要节日。相传,汉文帝(前179—前157年)为庆祝周勃于正月十五勘平诸
- 在一个规范化的研发流程中,一般遵循如下流程:开发阶段:研发功能或者修复bug,在本地自测。代码审核阶段:提交代码,并请求团队内人员做code
- asp之家注:作为一个学习asp的爱好者,相信一定接触过session,我们经常使用session来作为会员登录的验证,当然也可以使用COO
- 下面来先看一个简单例子<!DOCTYPE html><html lang="zh-CN" ng-app
- SQL Server的彻底卸载与再次安装可能大家已经有深刻体会,SQL Server的卸载十分繁琐。最让人头疼的是,出了问题的SQL Ser
- 0. 学习目标栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作