查询排序: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。

posted @   古兰精  阅读(9930)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2017-06-12 浅析nginx配置server_name为多个时的坑
2017-06-12 浏览器工作原理:浅析TCP协议 - 如何保证页面文件能被完整送达浏览器
点击右上角即可分享
微信分享提示