在 MySQL 中,使用 CASE WHEN 进行排序是一种非常强大的技巧,可以让你根据复杂的条件来定制排序逻辑。CASE WHEN 语句在 ORDER BY 子句中可以帮助你实现根据不同条件进行排序的需求。
基本语法
CASE WHEN
语句的基本语法如下:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
在 ORDER BY
子句中,你可以使用这个语法来生成一个排序条件。例如:
SELECT column1, column2
FROM table
ORDER BY
CASE
WHEN condition1 THEN value1
WHEN condition2 THEN value2
ELSE default_value
END;
代码示例
假设你有一个 employees 表,如下所示:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE
);
1. 按部门排序,然后按薪资排序
假设你希望首先按 department
列的值进行排序,然后按 salary
排序,但要使 department
为某些特定值的记录排在最前面。你可以这样写:
SELECT name, department, salary
FROM employees
ORDER BY
CASE
WHEN department = 'Sales' THEN 1
WHEN department = 'Engineering' THEN 2
ELSE 3
END,
salary DESC;
这个查询将首先按部门排序,使得 department
为 Sales
的记录排在最前面,其次是 Engineering
部门的记录,最后是其他部门的记录。然后,在每个部门内,按 salary
降序排序。
2. 根据不同条件进行复杂排序
假设你要根据 hire_date
进行排序,如果 hire_date
为 NULL
,则将这些记录排在前面:
SELECT name, hire_date
FROM employees
ORDER BY
CASE
WHEN hire_date IS NULL THEN 0
ELSE 1
END,
hire_date DESC;
这里的 CASE 语句将 hire_date
为 NULL 的记录标记为 0,其他记录标记为 1。这样,所有 hire_date
为 NULL 的记录会排在最前面。接着,对于非 NULL
的记录,按 hire_date
降序排序。
3. 根据多个条件排序
你还可以结合多个条件进行排序。例如,假设你想要首先按 department
排序,然后在每个部门内,按 salary
从高到低排序,如果薪资相同,再按 hire_date
排序:
SELECT name, department, salary, hire_date
FROM employees
ORDER BY
CASE
WHEN department = 'Sales' THEN 1
WHEN department = 'Engineering' THEN 2
ELSE 3
END,
salary DESC,
hire_date ASC;
总结
使用 CASE WHEN
语句在 ORDER BY
子句中可以实现非常灵活的排序逻辑。通过定义不同的条件和排序值,你可以对查询结果进行自定义排序,从而满足各种业务需求。