有时候,我们希望依据某些条件逻辑来排序。比如,对于员工表 emp,我们希望按照薪资(sal )从低到高排序。有一个要求,处于管理岗位的职工排在普通员工的后面,即 job 等于 MANAGER 或 PRESIDENT 的员工排在其它员工的后面,job 等于 PRESIDENT 的员工放在最后。也就是说,优先按照职位(job)的规则排序,再按照薪资(sal)排序。
图 1 emp 原始表数据
我们希望返回的结果集如下。
图 2 结果集
最简单的做法就是在 ORDER BY
子句后面使用 CASE 表达式。
由于 job 字段只是作为逻辑条件提供排序的依据,不能直接对它排序。我们可以将 job 字段的所有值划分为三类,每一个类用一个数值表示,再将这个分类的字段作为排序字段参与排序即可。
SELECT * FROM emp ORDER BY CASE WHEN job = 'PRESIDENT' THEN 0 WHEN job = 'MANAGER' THEN 1 ELSE 2 END DESC, sal
另外,也可以把 CASE 表达式移到 SELECT
子句中。
SELECT *, CASE WHEN job = 'PRESIDENT' THEN 0 WHEN job = 'MANAGER' THEN 1 ELSE 2 END AS ordered FROM emp ORDER BY ordered DESC, sal