查询排序:order by case when理解(根据一个字段的多个值进行排序)、在order By子句中使用case语句的理解、ORDER BY 2 DESC 中 2 的理解


一、order by case when 理解  —— 根据一个字段的多个值进行排序

  先看例子: 查询 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 ,

  查询结果像如下:

 姓名 年龄 性别 状态 张三 151 李四 201 王五 281 赵六 100 丁一 144 刘德华 154 张爱玲 253 李世民 202 杨贵妃 226 孙悟空 156 项羽 285

  如果是使用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;

三、ORDER BY 2 DESC 中 2 的理解

  示例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。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM