先看例子: 查询 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 的话,则将满足条件的结果集放在总结果集的前面,然后将不满足条件的结果集无序地附加到总结果集后面。