一、需求背景
有一个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 等等。