MySQL 如何使用OR条件实现MySQL CASE?
MySQL 的 CASE 表示条件运算,可以根据不同的条件返回不同的结果,但是如果有多个条件需要判断,当这些条件都满足时需要返回同一结果,传统的方法需要使用多个 CASE ,这时就需要用到 OR 条件来实现。本文将介绍如何使用 OR 条件实现 MySQL CASE。
阅读更多:MySQL 教程
CASE语法
首先,我们来看 CASE 语句的基础用法。CASE 只有一种语法形式,我们将其分为两种类型:简单 CASE 和搜索 CASE 。它们的区别在于简单 CASE 只用来比较一个特定的值,而搜索 CASE 在比较值时可以使用运算符等。
简单CASE语法
CASE value
WHEN compare_value THEN result
[WHEN compare_value THEN result ...]
[ELSE default_result]
END
简单 CASE 语句根据 value 与 compare_value 的比较结果来选择 result 。如果没有匹配的结果,将返回 default_result 。下面是一个简单 CASE 的示例:
SELECT CASE 'H'
WHEN 'A' THEN 'Good'
WHEN 'B' THEN 'Better'
WHEN 'C' THEN 'Best'
ELSE 'Unknown'
END AS 'Rank';
输出:
+---------+
| Rank |
+---------+
| Unknown |
+---------+
从输出可以看出,’H’ 与任何 compare_value 都不相等,所以返回 ELSE 中指定的值。
搜索CASE语法
CASE
WHEN condition THEN result
[WHEN condition THEN result ...]
[ELSE default_result]
END
搜索 CASE 稍微有点不同,从上到下测试每一个 WHEN 后面的 condition ,当其中的任意一个为真即为匹配,返回该 WHEN 后面的 result 。如果没有匹配的结果,将返回 default_result 。
下面是一个搜索 CASE 的示例:
SELECT CASE
WHEN 1>2 THEN 'One is greater than two'
WHEN 1>0 THEN 'One is greater than zero'
ELSE 'Impossible'
END AS 'Comparison';
输出:
+---------------------------+
| Comparison |
+---------------------------+
| One is greater than zero |
+---------------------------+
从输出可以看出,第一个 WHEN 条件为假,所以不匹配。第二个 WHEN 条件为真,所以返回该 WHEN 后面的 result 。
OR条件用法
在包含多个条件的情况下,当这些条件都满足时需要返回同一结果。传统的方法需要使用多个 CASE 。但是,通过使用 OR 条件,我们可以在单个 CASE 中实现这个目标。
下面是带有 OR 条件的 CASE 语句示例:
SELECT
CASE
WHEN a > 5 OR b < 5 THEN 'Greater or lesser than 5'
WHEN a = b THEN 'Equal'
ELSE 'Not greater, not equal, and not less than 5'
END AS 'Comparison'
FROM
Table_A;
输出:
+-------------------------------------+
| Comparison |
+-------------------------------------+
| Greater or lesser than 5 |
| Greater or lesser than 5 |
| Greater or lesser than 5 |
| Not greater, not equal, and not less than 5 |
| Equal |
+-------------------------------------+
示例
下面是一个更具体的示例。假设我们有一个 employees 表格,其中包括员工的 ID、名字、薪水和职位等信息。
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL DEFAULT '0',
`first_name` varchar(14) NOT NULL DEFAULT '',
`last_name` varchar(16) NOT NULL DEFAULT '',
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
`salary` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB;
INSERT INTO `employees` (`emp_no`, `first_name`, `last_name`, `gender`, `hire_date`, `salary`, `title`) VALUES
(10001, 'Georgi', 'Facello', 'M', '1986-06-26', 60117, 'Senior Engineer'),
(10002, 'Bezalel', 'Simmel', 'F', '1985-11-21', 65828, 'Staff'),
(10003, 'Parto', 'Bamford', 'M', '1986-08-28', 40006, 'Senior Engineer'),
(10004, 'Chirstian', 'Koblick', 'M', '1986-12-01', 40054, 'Senior Engineer'),
(10005, 'Kyoichi', 'Maliniak', 'M', '1989-09-12', 78228, 'Senior Staff');
假设我们需要根据员工的薪水,从高到低显示员工的姓名和职位:
SELECT
CONCAT(first_name, ' ', last_name) AS 'Employee Name',
title AS 'Title',
salary AS 'Salary'
FROM employees
ORDER BY
salary DESC;
输出:
+-------------------+----------------------+--------+
| Employee Name | Title | Salary |
+-------------------+----------------------+--------+
| Georgi Facello | Senior Engineer | 60117 |
| Bezalel Simmel | Staff | 65828 |
| Kyoichi Maliniak | Senior Staff | 78228 |
| Chirstian Koblick | Senior Engineer | 40054 |
| Parto Bamford | Senior Engineer | 40006 |
+-------------------+----------------------+--------+
现在,假设我们需要将员工薪水超过 70000 的员工列为 “高薪员工”,薪水 50000 到 70000 的员工列为 “中等薪水员工”,薪水低于 50000 的员工为 “低薪员工”。我们可以使用 OR 条件来实现这个目标,如下所示:
SELECT
CONCAT(first_name, ' ', last_name) AS 'Employee Name',
title AS 'Title',
salary AS 'Salary',
CASE
WHEN salary > 70000 THEN '高薪员工'
WHEN salary BETWEEN 50000 AND 70000 THEN '中等薪水员工'
ELSE '低薪员工'
END AS 'Salary Level'
FROM employees
ORDER BY
salary DESC;
输出:
+-------------------+----------------------+--------+------------------+
| Employee Name | Title | Salary | Salary Level |
+-------------------+----------------------+--------+------------------+
| Kyoichi Maliniak | Senior Staff | 78228 | 高薪员工 |
| Bezalel Simmel | Staff | 65828 | 中等薪水员工 |
| Georgi Facello | Senior Engineer | 60117 | 中等薪水员工 |
| Chirstian Koblick | Senior Engineer | 40054 | 低薪员工 |
| Parto Bamford | Senior Engineer | 40006 | 低薪员工 |
+-------------------+----------------------+--------+------------------+
我们可以看到结果已经按照 Salary Level 进行了分类。
结论
OR 条件提供了在单个 CASE 语句中实现多个条件判断的方法,使代码更加简洁和易于阅读。当需要进行多个 CASE 操作时,可以考虑使用 OR 条件来减少代码量。
极客笔记