🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注
CASE、WHEN、ELSE、END 概述
通俗一点的说 CASE、WHEN、ELSE、END
这些关键字在我们的SQL Server 2000
中是用来在SQL语句
中实现逻辑条件判断
的。
这些关键字可以让我们根据某些条件
来决定返回什么值,就像我们开发编程语言中的if-else
语句一样
具体每一个关键字的含义如下表:
关键字 | 描述 |
---|---|
CASE(案例) | 一个条件语句的开始关键字 |
WHEN(何时) | CASE后面跟着一个WHEN条件,如果这个条件为真,就执行对应的操作 |
THEN | 它是紧跟在WHEN条件后面,表示如果WHEN的条件为真,则返回THEN后面的表达式或者值 |
ELSE | 如果所有的WHEN条件都不成立,就返回ELSE后面的表达式或者值 |
END | 表示整个CASE语句的结束 |
应用场景
我们先来看一个简单的案例, SQL如下:
CREATE TABLE employees (
eid INT PRIMARY KEY IDENTITY, --员工ID
username NVARCHAR(100) NOT NULL, -- 员工姓名
salary DECIMAL(10, 2) NOT NULL -- 员工薪水
)
INSERT INTO employees (username, salary) VALUES ('张三', 6000.00);
INSERT INTO employees (username, salary) VALUES ('李四', 4000.00);
INSERT INTO employees (username, salary) VALUES ('王五', 2500.00);
INSERT INTO employees (username, salary) VALUES ('赵六', 5500.00);
INSERT INTO employees (username, salary) VALUES ('孙七', 2900.00);
如图
问题需求
现在问题来了,我们需要根据薪水来给员工划分等级~并且查询出来的每个员工都要显示这个等级
具体条件如下:
薪水大于5000的,级别为高
薪水在3000到5000之间的,级别为中
薪水小于3000的,级别为低
SQL如下
SELECT username,salary,
CASE
WHEN salary > 5000 THEN '高等'
WHEN salary > 3000 and salary < 5000 THEN '中等'
WHEN salary < 3000 THEN '低等'
ELSE '超级差的人'
END AS '等级显示'
FROM employees
ORDER BY salary DESC;
如图
这里在查询中我们使用了一个别名给CASE
命名,这样查询结果中就会有一个新的临时等级显示列l来显示每个员工的薪水级别!
怎么样是不是很简单~ 我们再看一个比较贴近实际开发的例子
我们创建一个名为`SalesRecords``的销售记录表,它包含以下字段:
sid:销售记录的唯一标识符
pid:产品的唯一标识符
saleAmount:销售金额
saleDate:销售日期
region:销售区域
如下
-- 创建数据表
CREATE TABLE SalesRecords (
sid INT PRIMARY KEY IDENTITY,
pid VARCHAR(255) NOT NULL,
SaleAmount DECIMAL(10, 2) NOT NULL,
SaleDate DATETIME NOT NULL,
region VARCHAR(50) NOT NULL
);
-- 插入数据
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 1500.00, '2023-10-01', '北部新区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 2000.00, '2023-10-02', '西南地区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 3000.00, '2023-10-03', '东南亚地区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 2500.00, '2023-10-04', '西北地区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 1800.00, '2023-10-05', '北部新区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 3500.00, '2023-10-06', '西北地区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 1200.00, '2023-10-07', '东南亚地区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 500.00, '2023-10-09', '西南地区');
INSERT INTO SalesRecords (pid, SaleAmount, SaleDate, region) VALUES (newid(), 600.00, '2023-10-10', '北部新区');
如图
那么现在我们要查询根据销售金额
来计算销售提成金额
并且把提成之后的金额显示出来!
具体提成的比例条件如下
销售金额小于1000元的,提成比例为5%
销售金额在1000元到3000元之间的,提成比例为10%
销售金额大于3000元的,提成比例为15%
那么这里我们依旧可以使用CASE语句
来实现这个逻辑,并计算每个销售记录的提成金额!
如下
SELECT
sid,
SaleAmount,
SaleDate,
region,
CASE
WHEN SaleAmount < 1000 THEN SaleAmount * 0.05
WHEN SaleAmount BETWEEN 1000 AND 3000 THEN SaleAmount * 0.10
ELSE SaleAmount * 0.15
END AS '提成金额'
FROM
SalesRecords ORDER BY SaleAmount DESC;
如图
这样我们是不是就可以很方便的在查询结果中包含每个销售记录及其对应的提成金额了!
当然如果说你想要把计算出来的结果进行保存或者更新也是可以的, 我们使用update
更新语句把这个结果加入到一个新的字段中就OK了!
就按照上面这个为例我们先添加一个提成字段
到SalesRecords表
如下
ALTER TABLE SalesRecords ADD Commission DECIMAL(10, 2);
然后我们结合CASE语句
执行计算更新操作
来同时更新提成字段Commission
的值
如下
UPDATE SalesRecords
SET Commission = CASE
WHEN SaleAmount < 1000 THEN SaleAmount * 0.05
WHEN SaleAmount BETWEEN 1000 AND 3000 THEN SaleAmount * 0.10
ELSE SaleAmount * 0.15
END;
如图
然后我们直接查询一下这个SalesRecords表
如图
这样就永久的保存了想要的数据了!
"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚
好玩 好用 好看
的干货教程可以点击下方关注❤️微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇