zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

排序 一个 查询 进行 理解 语句 多个 by
2023-09-11 14:19:54 时间

一、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。