ORDER BY 高级用法之CASE WHEN

转载于:https://www.cnblogs.com/178mz/p/6428958.html

今天在公司查看一段sql SP代码,发现了一段比较奇怪的代码。

大概长这样子:

Select * from tableA
 ORDER BY ColA ,
                CASE 
                     WHEN  type = 5 
                          THEN 200  
                      WHEN  type = 6 
                          THEN 300  
                END                  

 

小弟才疏学浅,咋一看到代码以为这样的:

Select * from tableA
WHERE type=5
ORDER BY ColA ,200
               

但是执行报错,同时也忘记了 order by 后面加数字是什么意思了。。。

果断查了一下:

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

原来order by后面跟数字是代表以第几列排序的意思。

但是SP 中 用的是200...甚至300....没这么多列啊。。。

事实证明 order by 后面用case when 并不等于 order by 数字

查了相关资料,并且找个一个表来测试,

无 CASE WHEN

ORDER BY 后面不使用 CASE WHEN

测试sql代码

SELECT  [ServerId]
      ,[ServerCode]
      ,[InBound]
      ,[OutBound]
      ,[IP]
      ,[PhoneArea]
      ,[Valid]
  FROM [ServerInfo] with(nolock)
  ORDER BY Location

 

查询结果

我们可以看到IP 为192.168.130.81 的排在第一位

 

一个CASE WHEN

加上 CASE WHEN 当IP 为  192.168.130.85 时,我们返回100,其他返回1000.

代码如下

SELECT  [ServerId]
      ,[ServerCode]
      ,[InBound]
      ,[OutBound]
      ,[IP]
      ,[PhoneArea]
      ,[Valid]
  FROM [ServerInfo] with(nolock)
  ORDER BY Location
  ,CASE
    WHEN  IP='192.168.130.85'
    THEN 100
    ELSE 1000
   END

 

执行结果

我们可以看到IP 为192.168.130.81 的已经不再第一位了,192.168.130.85 的被排在了第一位。

因为IP等于192.168.130.85的我们返回了100 ,不等于192.168.130.85 的我们返回了1000

100比1000小,所以192.168.130.85 的被排在了第一位。

 

两个CASE WHEN

我们在加一个 CASE WHEN  当IP等于192.168.130.87 时,我们返回2,其他返回10.

代码如下

SELECT  [ServerId]
      ,[ServerCode]
      ,[InBound]
      ,[OutBound]
      ,[IP]
      ,[PhoneArea]
      ,[Valid]
  FROM [ServerInfo] with(nolock)
  ORDER BY Location
  ,CASE
    WHEN  IP='192.168.130.85'
    THEN 100
    ELSE 1000
   END
 ,CASE
    WHEN  IP='192.168.130.87'
    THEN 2
    ELSE 10
   END

我们可以猜一下执行结果。

第一个CASE WHEN 当IP等于192.168.130.85的我们返回了100 ,不等于192.168.130.85 的我们返回了1000

第二个CASE WHEN 当IP等于192.168.130.87的我们返回了2 ,不等于192.168.130.87 的我们返回了10

结果应该 192.168.130.87 被排在第一 ,因为第一个case when返回1000 但是被第二个CASE WHEN返回是2覆盖掉了,2最小的,所以排在第一。

 

哈哈哈。。。就是这样。。。

其实,执行结果是这样的。

 

我们可以看到192.168.130.85 被排在第一,

192.168.130.87被排在第二。

其实两个CASE WHEN是相互不影响的。

其实两个CASE WHEN的sql 结果等价于下面的sql

 

SELECT  [ServerId]
      ,[ServerCode]
      ,[InBound]
      ,[OutBound]
      ,[IP]
      ,[PhoneArea]
      ,[Valid]
     ,CASE
          WHEN  IP='192.168.130.85'
          THEN 100
          ELSE 1000
      END AS MYORDER1
      ,CASE
          WHEN  IP='192.168.130.87'
          THEN 2
          ELSE 10
       END AS MYORDER2
  FROM [ServerInfo] with(nolock)
  ORDER BY Location , MYORDER1,MYORDER2

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MySQL中,ORDER BY语句后面的CASE WHEN子句用于根据条件对结果进行排序。根据提供的引用内容,有三种方式来使用CASE WHEN子句进行排序。 第一种方式是在ORDER BY语句中直接使用CASE WHEN语句,如引用所示。在这种情况下,可以根据条件的不同给出不同的排序优先级,例如当street_code等于req.streetCode时,优先级为1,当org_code等于req.orgCode时,优先级为2,其余情况下优先级为3。然后可以继续使用people_number字段进行降序排序。 第二种方式是使用CASE WHEN语句在SELECT语句中创建一个别名作为排序依据,如引用所示。在这种情况下,可以在SELECT语句中使用CASE WHEN语句创建一个sortCode字段,并根据条件的不同为不同的记录赋予不同的排序值。然后可以在ORDER BY语句中使用这个别名进行排序,再继续使用people_number字段进行降序排序。 第三种方式与第二种方式类似,只是在WHERE和ORDER BY子句中使用了#作为占位符来传递变量的值,如引用所示。这种方式可以保证正确地取得变量的值,并根据条件的不同为不同的记录赋予不同的排序值。然后可以在ORDER BY语句中使用别名sortCode进行排序,再继续使用people_number字段进行降序排序。 总的来说,在MySQL中,可以使用CASE WHEN子句根据条件对结果进行排序,并在ORDER BY语句中使用别名或直接使用CASE WHEN语句来排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [mysql 某列指定值靠前排序:order by 高级用法case when](https://blog.csdn.net/qq_24757635/article/details/108195246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值