MySQL 如何使用OR条件实现MySQL CASE?

MySQL 如何使用OR条件实现MySQL CASE?

MySQLCASE 表示条件运算,可以根据不同的条件返回不同的结果,但是如果有多个条件需要判断,当这些条件都满足时需要返回同一结果,传统的方法需要使用多个 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 语句根据 valuecompare_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 条件来减少代码量。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程