MySQL小技巧—使用 CASE WHEN 进行排序

在 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;

这个查询将首先按部门排序,使得 departmentSales 的记录排在最前面,其次是 Engineering 部门的记录,最后是其他部门的记录。然后,在每个部门内,按 salary 降序排序。

2. 根据不同条件进行复杂排序

假设你要根据 hire_date 进行排序,如果 hire_dateNULL,则将这些记录排在前面:

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 子句中可以实现非常灵活的排序逻辑。通过定义不同的条件和排序值,你可以对查询结果进行自定义排序,从而满足各种业务需求。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叫我OldFe

一分也是鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值