跳至正文

MySQL 查询排序:order by case when 理解

先看例子: 查询 task 表,根据任务状态排序,状态1 > 状态3 > 状态4 > 状态5 > 状态2 > 状态6 > 状态为其他

SELECT * FROM `task `
WHERE 1
ORDER BY
    CASE
        WHEN `status` = 1
            THEN 1
        WHEN `status` = 3
            THEN 2
        WHEN `status` = 4
            THEN 3
        WHEN `status` = 5
            THEN 4
        WHEN `status` = 2
            THEN 5
        WHEN `status` = 6
            THEN 6
        ELSE `status`
    END

如果是使用order by case when后,再根据其它条件排序,比如创建时间,可以继续加排序条件

SELECT * FROM `task `
WHERE 1
ORDER BY
    CASE
        WHEN `status` = 1
            THEN 1
        WHEN `status` = 3
            THEN 2
        WHEN `status` = 4
            THEN 3
        WHEN `status` = 5
            THEN 4
        WHEN `status` = 2
            THEN 5
        WHEN `status` = 6
            THEN 6
    END,
    `create_time` ASC

此句sql的意思是:先根据任务状态排序:状态1 > 状态3 > 状态4 > 状态5 > 状态2 > 状态6,再根据创建时间升序排序。

在order By子句中使用case语句的理解

CASE 语句可以在SELECT 子句和ORDER BY 子句中使用

CASE语句分为两种 Case Simple Expression 和 Case Search Expression

-- Case Simple Expression:
CASE Column1
WHEN V1 THEN R1
WHEN V2 THEN R2
ELSE R3
END

-- Case Search Expression
CASE 
WHEN C1=V1 THEN R1
WHEN C2=V2 THEN R2
ELSE R3
END

当在 Order by 中使用Case语句时:

如果排序是按照 ASC 的话,会将不满足条件的结果集无序地放在总结果集的前面,然后将满足条件的结果集排序后附加到总结果集中;

如果使用 DESC 的话,则将满足条件的结果集放在总结果集的前面,然后将不满足条件的结果集无序地附加到总结果集后面。