先看例子: 查询 user 表,根据用户状态排序。状态为1的排在最前面 >其次是状态为0 >状态为4 >状态为3 >状态为2 >状态为6 >状态为其他的
select * from user
where......
order by
case when status=1 then 0
when status=0 then 1
when status=4 then 2
when status=3 then 3
when status=2 then 4
when status=6 then 5
when status=5 then 6
else status end ,
查询结果像如下:
姓名 年龄 性别 状态
张三 15 男 1
李四 20 男 1
王五 28 男 1
赵六 10 男 0
丁一 14 男 4
刘德华 15 男 4
张爱玲 25 女 3
李世民 20 男 2
杨贵妃 22 女 6
孙悟空 15 男 6
项羽 28 男 5
如果是使用order by case when后,再根据其它条件排序,比如时间,可以继续加排序条件
1、先说第一个用多个条件进行排序
ORDER BY name,age (多条件排序,还有条件可以再加在后面)
ORDER BY name desc,age asc (不同条件排序规则,先按名字降序排,再按年龄升序排)
2、根据一个条件的多个值,进行排序。
order by
case when status=1 then 0
when status=0 then 1
when status=4 then 2
when status=3 then 3
when status=2 then 4 ,
add_time desc
此句sql的意思是: 先根据用户状态排序:状态为1的排在最前面 >其次是状态为0 >状态为4 >状态为3 >状态为2 ; 再根据添加时间降序排序。
一、在order By子句中使用case语句的理解
CASE 语句可以在SELECT 子句和ORDER BY 子句中使用
CASE语句分为两种Case Simple Expression and Case Search Expression
1、Case Simple Expression:
CASE Column1
WHEN V1 THEN R1
WHEN V2 THEN R2
ELSE R3
END
2、Case Search Expression
CASE
WHEN C1=V1 THEN R1
WHEN C2=V2 THEN R2
ELSE R3
END
当在 Order by 中使用Case语句时:
如果排序是按照ASC的话,会将不满足条件的结果集无序地放在总结果集的前面,然后将满足条件的结果集排序后附加到总结果集中;
如果使用DESC的话,则将满足条件的结果集放在总结果集的前面,然后将不满足条件的结果集无序地附加到总结果集后面。
假设现在项目(project)状态分为以下几种:草稿1、已发布2、已下架3、删除4,现在想要展示已经发布的项目展示在最上面,然后是草稿、已下架、已删除状态的项目
select
id, name, subject_type_required, created_time
from project
order by case status
when 2 then 1
when 1 then 2
when 3 then 3
when 4 then 4
end asc,
created_time desc;
示例1:
SELECT last_name, salary , hire_date
FROM EMPLOYEES
ORDER BY salary DESC;
示例2:
SELECT last_name, salary , hire_date
FROM EMPLOYEES
ORDER BY 2 DESC;
以上两个示例结果相同:因为ORDER BY salary DESC == ORDER BY 2 DESC,salary是第二个元素,所以可以使用2来代替,但是数字不可以使用0,也不可以超出查询的列。
例如:select * from employers order by x,如果employers表有九个字段,那个X的范围就是1 - 9,不能是0,也不能是10。