翼度科技»论坛 编程开发 .net 查看内容

Case表达式

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
在发现结果为真的WHEN子句时,CASE表达式的真假值判断会终止,剩余的WHEN子句会被忽略:
  1. CASE WHEN col_1 IN ('a', 'b') THEN '第一'
  2. WHEN col_1 IN ('a') THEN '第二'
  3. ELSE '其他' END
复制代码
注意:

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

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

下面给出的group by引用select中定义的别名,case写在group by违反SQL规则(GROUP BY 子句比 SELECT 语句先执行):
  1. SELECT CASE pref_name
  2. WHEN '德岛' THEN '四国'
  3. WHEN '香川' THEN '四国'
  4. WHEN '爱媛' THEN '四国'
  5. WHEN '高知' THEN '四国'
  6. WHEN '福冈' THEN '九州'
  7. WHEN '佐贺' THEN '九州'
  8. WHEN '长崎' THEN '九州'
  9. ELSE '其他' END AS district,
  10. SUM(population)
  11. FROM PopTbl
  12. GROUP BY district;
复制代码
案例2

用一条 SQL 语句进行不同条件的统计
  1. SELECT pref_name,
  2. SUM( CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m,
  3. SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) AS cnt_f
  4. FROM PopTbl2
  5. GROUP BY pref_name;
复制代码
总结:聚合函数可以实现行转列,实现select的条件分支(代替where)
案例3

用 CHECK 约束定义多个列的条件关系
题目:女性员工工资必须在20w以上(蕴含式(conditional)的逻辑表达式,记作 P → Q)
  1. CONSTRAINT check_salary CHECK
  2. ( CASE WHEN sex = '2'
  3. THEN CASE WHEN salary > 200000
  4. THEN 1 ELSE 0 END
  5. ELSE 1 END = 1 )
复制代码
案例4

在 UPDATE 语句里进行条件分支

要求

  • 对当前工资为 30 万以上的员工,降薪 10%。
  • 对当前工资为 25 万以上且不满 28 万的员工,加薪 20%。
  1. UPDATE Salaries
  2. SET salary = CASE WHEN salary >= 300000
  3. THEN salary * 0.9
  4. WHEN salary >= 250000 AND salary < 280000
  5. THEN salary * 1.2
  6. ELSE salary END;
复制代码
案例5

表之间的数据匹配

用以上表生成下面表:
课程名称6 月7 月8 月会计入门○××财务知识××○簿记考试○××税务师○○○注:此sql实现可以使用in或exists谓词
  1. SELECT course_name,
  2.          CASE WHEN course_id IN
  3.          (SELECT course_id FROM OpenCourses
  4.          WHERE month = 200706) THEN '○'
  5.          ELSE '×' END AS "6 月",
  6.          CASE WHEN course_id IN
  7.          (SELECT course_id FROM OpenCourses
  8.          WHERE month = 200707) THEN '○'
  9.          ELSE '×' END AS "7 月",
  10.          CASE WHEN course_id IN
  11.          (SELECT course_id FROM OpenCourses
  12.          WHERE month = 200708) THEN '○'
  13.          ELSE '×' END AS "8 月"
  14. FROM CourseMaster;
复制代码
案例6

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


  • 获取只加入了一个社团的学生的社团 ID。
  • 获取加入了多个社团的学生的主社团 ID。
注:此处使用MAX,确保每个学生只被计算一次,确保在每个分组(每个学生)中只选择一个社团.
  1. SELECT std_id,
  2. CASE WHEN COUNT(*) = 1 -- 只加入了一个社团的学生
  3. THEN MAX(club_id)
  4. ELSE MAX(CASE WHEN main_club_flg = 'Y'
  5.                  THEN club_id
  6.                  ELSE NULL END)
  7. END AS main_club
  8. FROM StudentClub
  9. GROUP BY std_id;
复制代码
case在执行时会被判断为一个固定值,因此可以用在聚合函数中.
习题实践 求两列中最大值
  1. select key,
  2.        case when x < y then y
  3.                 else x end as greatest
  4. from Greatests;
复制代码
拓展为三列,需要在分支中嵌套(case表达式在执行时会解析为标量值):
  1. select key,
  2.        case when case when x < y then y else x end < z
  3.                            then z
  4.                         else case when x < y then y else x end
  5.                 end as greatest
  6. from Greatests;
复制代码
如果为四列或者五列,先行转列之后使用max函数:
  1. select key,MAX(col) as greatest
  2. from (
  3.                 select key,x as col from Greatests
  4.                 union all
  5.                 select key,y as col from Greatests
  6.                 unoin all
  7.                 select key,z as col from Greate
  8.                 )TMP
  9. group by key;
复制代码
其中上述使用union all产生重复数据(建立临时表进行行转列),之后使用group by进行排序,最后max进行去重.
注:Oracle 或 MySQL 可以使用下面函数进行求解:
  1. SELECT key, GREATEST(GREATEST(x,y), z) AS greatest
  2. FROM Greatests;
复制代码
来源:https://www.cnblogs.com/ayy-200248/p/18120324
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具