zoukankan      html  css  js  c++  java
  • 查询排序:order by case when理解、在order By子句中使用case语句的理解

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

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

  • 相关阅读:
    CentOS7 设置软件镜像源
    让树莓派自动上报IP地址到邮箱,二代B
    给树莓派安装看门狗的两种方法,二代B
    树莓派(Raspberry Pi)USB无线网卡自动连接,二代B
    升级MAC OX上的Python到3.4
    http 返回码 405 解决方案之一
    CentOS 6.4 SSH 免密码登录
    SVN的Hooks功能--强制添加注释
    PHP开发中,让var_dump调试函数输出更美观 ^_^#
    CentOS 6.4 命令行 安装 VMware Tools
  • 原文地址:https://www.cnblogs.com/goloving/p/13100732.html
Copyright © 2011-2022 走看看