SQL 案例分析:CASE 条件表达式

本文介绍了如何使用SQL的CASE表达式来根据员工入职年限和性别确定周年庆礼品。案例中,针对不同入职年限和性别的员工,设定了不同的礼品发放规则,并展示了适用于Oracle、MySQL、PostgreSQL、Microsoft SQL Server和SQLite的查询语句示例。通过这些查询,人事部门可以轻松获取每位员工应得的礼品信息。
摘要由CSDN通过智能技术生成

大家好,我是只谈技术不剪发的 Tony 老师。

今天我们介绍一个 CASE 条件表达式的应用案例,使用的示例表点此下载

假如公司即将成立 20 周年,打算给全体员工发放一个周年庆礼品。发放礼品的规则如下:

  • 截至 2020 年入职年限不满 10 年的员工,男性员工的礼品为手表一块,女性员工的礼品为化妆品一套;
  • 截至 2020 年入职年限满 10 年不满 15 年的员工,男性员工的礼品为手机一部,女性员工的礼品为项链一条;
  • 截至 2020 入职年限满 15 年的员工,不论男女礼品统一为电脑一台。

现在人事部门需要知道为每位员工发放什么礼品,如何通过查询语句得到这些信息?

搜索 CASE 表达式非常合适这类逻辑条件的处理,我们可以使用以下语句:

-- Oracle、MySQL以及PostgreSQL
SELECT emp_name AS "员工姓名", hire_date AS "入职日期",
     CASE
       WHEN EXTRACT(YEAR FROM hire_date)> 2011 AND sex = '男' THEN '手表'
       WHEN EXTRACT(YEAR FROM hire_date) > 2011 AND sex = '女' THEN '化妆品'
       WHEN EXTRACT(YEAR FROM hire_date) > 2006 AND sex = '男' THEN '手机'
       WHEN EXTRACT(YEAR FROM hire_date) > 2006 AND sex = '女' THEN '项链'
       ELSE '电脑'
     END AS "礼品"
FROM employee;

以上语句执行时首先判断第 1 个 WHEN 子句中的条件(入职年限不满 10 年的男性员工)是否成立,如果成立则返回对应 THEN 子句中的结果(手表);如果不成立则继续判断第 2 个WHEN子句中的条件(入职年限不满 10 年的女性员工)是否成立,如果成立则返回对应 THEN 子句中的结果(化妆品);依此类推,如果没有任何条件成立,返回 ELSE 子句中的默认结果(电脑)。

除了搜索 CASE 表达式之外,我们还使用了 EXTRACT 函数提取员工的入职年份,因此以上查询适用于 Oracle、MySQL 以及 PostgreSQL。查询返回的结果如下。

员工姓名|入职日期   |礼品
------|----------|---
刘备   |2000-01-01|电脑
关羽   |2000-01-01|电脑
张飞   |2000-01-01|电脑
...
廖化   |2009-02-17|手机
关平   |2011-07-24|手机
赵氏   |2011-11-10|项链
...

Microsoft SQL Server 可以使用 DATAPART 函数提取日期中的信息,例如:

-- Microsoft SQL Server
SELECT emp_name AS "员工姓名", hire_date AS "入职日期",
     CASE
       WHEN DATEPART(YEAR, hire_date) > 2011 AND sex = '男' THEN '手表'
       WHEN DATEPART(YEAR, hire_date) > 2011 AND sex = '女' THEN '化妆品'
       WHEN DATEPART(YEAR, hire_date) > 2006 AND sex = '男' THEN '手机'
       WHEN DATEPART(YEAR, hire_date) > 2006 AND sex = '女' THEN '项链'
       ELSE '电脑'
     END AS "礼品"
FROM employee;

SQLite可以使用 STRFTIME 函数提取日期中的信息,例如:

-- SQLite
SELECT emp_name AS "员工姓名", hire_date AS "入职日期",
     CASE
       WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2011 AND sex = '男'
       THEN '手表'
       WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2011 AND sex = '女'
       THEN '化妆品'
       WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2006 AND sex = '男'
       THEN '手机'
       WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2006 AND sex = '女'
       THEN '项链'
       ELSE '电脑'
     END AS "礼品"
FROM employee;

STRFTIME 函数返回的数据类型为字符串,我们通过 CAST 函数将其转换为整数。

以上案例来自图书《SQL编程思想》,相关视频:哔哩哔哩知乎

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不剪发的Tony老师

为 5 个 C 币而折腰。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值