首页 > 其他分享 >Case表达式

Case表达式

时间:2024-04-22 11:22:05浏览次数:22  
标签:Case CASE END WHEN ELSE SELECT id 表达式

在发现结果为真的WHEN子句时,CASE表达式的真假值判断会终止,剩余的WHEN子句会被忽略:

CASE WHEN col_1 IN ('a', 'b') THEN '第一'
 WHEN col_1 IN ('a') THEN '第二'
ELSE '其他' END

注意:

  1. 统一各分支返回的数据类型.
  2. 记得写end.
  3. 写else子句的习惯,否则执行结果默认处理为null.

案例1

将已有编号方式转换为新的方式并统计

下面给出的group by引用select中定义的别名,case写在group by违反SQL规则(GROUP BY 子句比 SELECT 语句先执行):

SELECT CASE pref_name
 WHEN '德岛' THEN '四国'
 WHEN '香川' THEN '四国'
 WHEN '爱媛' THEN '四国'
 WHEN '高知' THEN '四国'
 WHEN '福冈' THEN '九州'
 WHEN '佐贺' THEN '九州'
 WHEN '长崎' THEN '九州'
 ELSE '其他' END AS district,
 SUM(population)
FROM PopTbl
GROUP BY district;

案例2

用一条 SQL 语句进行不同条件的统计
image

SELECT pref_name,
 SUM( CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m, 
 SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) AS cnt_f 
 FROM PopTbl2
 GROUP BY pref_name;

总结:聚合函数可以实现行转列,实现select的条件分支(代替where)

案例3

用 CHECK 约束定义多个列的条件关系

题目:女性员工工资必须在20w以上(蕴含式(conditional)的逻辑表达式,记作 P → Q)

CONSTRAINT check_salary CHECK
 ( CASE WHEN sex = '2'
 THEN CASE WHEN salary > 200000
 THEN 1 ELSE 0 END
 ELSE 1 END = 1 )

案例4

在 UPDATE 语句里进行条件分支
image

要求

  1. 对当前工资为 30 万以上的员工,降薪 10%。
  2. 对当前工资为 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;

案例5

表之间的数据匹配
image

用以上表生成下面表:

课程名称 6 月 7 月 8 月
会计入门 × ×
财务知识 × ×
簿记考试 × ×
税务师

注:此sql实现可以使用in或exists谓词

SELECT course_name,
	 CASE WHEN course_id IN 
	 (SELECT course_id FROM OpenCourses 
	 WHERE month = 200706) THEN '○'
	 ELSE '×' END AS "6 月",
	 CASE WHEN course_id IN 
	 (SELECT course_id FROM OpenCourses
	 WHERE month = 200707) THEN '○'
	 ELSE '×' END AS "7 月",
	 CASE WHEN course_id IN 
	 (SELECT course_id FROM OpenCourses
	 WHERE month = 200708) THEN '○'
	 ELSE '×' END AS "8 月"
FROM CourseMaster;

案例6

在 CASE 表达式中使用聚合函数
image

  1. 获取只加入了一个社团的学生的社团 ID。
  2. 获取加入了多个社团的学生的主社团 ID。

注:此处使用MAX,确保每个学生只被计算一次,确保在每个分组(每个学生)中只选择一个社团.

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 StudentClub
 GROUP BY std_id;

case在执行时会被判断为一个固定值,因此可以用在聚合函数中.

习题实践 求两列中最大值

select key,
       case when x < y then y
	        else x end as greatest
from Greatests;

拓展为三列,需要在分支中嵌套(case表达式在执行时会解析为标量值):

select key,
       case when case when x < y then y else x end < z
	   		then z
			else case when x < y then y else x end
		end as greatest
from Greatests;

如果为四列或者五列,先行转列之后使用max函数:

select key,MAX(col) as greatest
from (
		select key,x as col from Greatests
		union all
		select key,y as col from Greatests
		unoin all
		select key,z as col from Greate
		)TMP
group by key;

其中上述使用union all产生重复数据(建立临时表进行行转列),之后使用group by进行排序,最后max进行去重.

注:Oracle 或 MySQL 可以使用下面函数进行求解:

SELECT key, GREATEST(GREATEST(x,y), z) AS greatest
 FROM Greatests;

标签:Case,CASE,END,WHEN,ELSE,SELECT,id,表达式
From: https://www.cnblogs.com/ayy-200248/p/18120324

相关文章

  • 【Java定时任务】浅谈CronTrigger的用法和在线Cron表达式生成网址
    1.CronTrigger的作用CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表。CronTrigger,你可以指定触发的时间表如“每星期五中午”,或“每个工作日9:30时”,甚至“每5分钟一班9:00和10:00逢星期一上午,星期三......
  • shell脚本正则表达式
    声明:以下内容为个人笔记,内容不完全正确,请谨慎参考。正则表达式含义:正则表达式使用的每个单独字符串来描述、匹配一些列符合语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等文本处理工具都支持正则表达式......
  • switch 表达式 - 使用 switch 关键字的模式匹配表达式
    switch表达式-使用 switch 关键字的模式匹配表达式项目2023/05/106个参与者反馈 本文内容Caseguard非详尽的switch表达式C#语言规范另请参阅可以使用 switch 表达式,根据与输入表达式匹配的模式,对候选表达式列表中的单个表达式进行求值。有关在语......
  • AutoCAD C# 在编程中使用字段表达式
    CAD中有些文字需要随着图纸的当前条件的变化自动变化,例如保存日期、打印日期、打印比例等等。CAD早期版本只是在扩展工具中提供了动态反应文字(rtext)功能,动态反应文字可以用CAD的Diesel表达式来定义动态文字,也可以动态链接文本文档,文本文档被编辑后,图纸中的文字会自动更新。由于......
  • 数据类型和表达式题目
    题目一求下列公式近似值题目二阿姆斯特朗数 也就是俗称的 水仙花数 ,是指一个三位数,其各位数字的立方和等于该数本身。例如:153=13+53+33,所以153就是一个 水仙花数 。求出1~1000之间所有的 水仙花数 。补充%d就是普通的输出了%2d是将数字按宽度为2,右对齐方式输出......
  • 数据库的关系代数表达式
    数据库的关系代数表达式关系代数是一种用于描述和操作关系数据库的形式化语言。它提供了一组基本操作,包括选择、投影、并、差、笛卡尔积等,可以用来表示和操作关系数据库中的数据。基本操作选择(Selection):从关系中选择满足指定条件的元组。投影(Projection):从关系中选择指定的属......
  • python 正则表达式匹配
    re模块: 案例:     python的贪婪和非贪婪 r的作用: ......
  • 在 VSCode 中使用正则表达式的示例
    下面是一些在VSCode中使用正则表达式的示例。在某个文件中查找相同的单词假设有一个名为sample.txt的文件,其内容如下:thequickbrownfoxjumpsoverthelazydog.thequickbrowncatjumpsoverthelazydog.thequickredhenjumpsoverthelazydog.我们想要查......
  • 栈4-后缀表达式
    栈4-后缀表达式中缀转后缀数字:直接输出左括号: 进栈运算符号:与栈顶符号进行优先级比较栈顶若是左括号,优先级最低栈顶符号优先级低: 此符号进栈栈顶符号优先级不低,弹出栈顶符号后进栈右括号:将栈顶符号弹出并输出,知道匹配到左括号遍历结束:弹出并输出所......
  • 栈5-后缀表达式求解
    栈5-后缀表达式的求解求解过程831-5*+数字:进栈[1,3,8]符号:-从栈中弹出右操作数-1从栈中弹出左操作数3-1根据符号进行运算2将运算结果压入栈中[2,8]遍历结束,栈中唯一的数字作为计算结果定义栈结构typedefstructMYNUM{LinkNodenode;int......