Mysql对包含正负值的同一个字段进行不同规则排序,取代union方法

一、需求背景

有一个Decimal字段,其中包含正值和负值。查询结果要求正值排在上边负值排在下边。同时负值内部又要遵循小值在上的要求

二、分析

一般这种情况会选择union方式进行分组然后排序,但是显然有更好的排序方式。首先要了解mysql orderby的排序规则。当order by后面跟多个字段,排序规则一致时

order by cl1,cl2,cl3; //先按照cl1进行排序,cl1相等或者都为null则按照cl2进行排序依次类推

当排序字段规则不同时

order by cl1 asc, cl2 desc,cl3 asc; //先按照cl1进行升序排序,再按照cl2降序排序,再按照cl3升序排序

三、实现

通过order by执行规律可以实现该需求即:

SELECT *
FROM table_name
ORDER BY 
  CASE WHEN number_column >= 0 THEN number_column END DESC, -- 整体降序排序
  CASE WHEN number_column < 0 THEN number_column END ASC;  -- 负值升序排序

四、总结

这个问题思考方向很多种,其实这就是根据先整体降序然后再将负值升序排列得来的,拓展的话case when column < 0 then -column 等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值