如何在SQL中将非0值前置、0值后置且不按数值排序?
如何让非0值排在结果集前面,0值放在末尾(无需按数值排序)
嘿,我完全懂你的需求——你只是想把所有非0的数值挪到前面,0值全丢到最后,根本不需要管非0值之间的大小顺序对吧?之前你试的那些ORDER BY写法之所以会按数值排序,是因为你在排序条件里用到了num_mojud本身,数据库自然会接着按数值给你排,这就偏离你的初衷了。
最简单的解决方案
我们只需要给“是否为0”这个条件设置优先级,完全不用碰数值本身。这里有两种常用写法:
简洁版(兼容多数现代数据库:MySQL、PostgreSQL等)
ORDER BY (num_mojud = 0) ASC
原理很简单:SQL里布尔值会被当作0(FALSE)和1(TRUE)处理。当num_mojud是0时,(num_mojud = 0)返回1;非0时返回0。用ASC排序的话,0会排在1前面,正好实现非0值在前、0值在后的效果,而且非0值的顺序会和你原始查询的结果顺序保持一致,不会被数值大小干扰。
兼容所有SQL数据库的通用写法
如果你的数据库不支持直接用布尔值排序,用CASE语句更稳妥:
ORDER BY CASE WHEN num_mojud = 0 THEN 1 ELSE 0 END ASC
这个逻辑和上面一样:给0值分配一个更高的排序优先级(1),非0值分配更低的优先级(0),升序排序后非0值自然就排在前面了。
为什么你之前的写法不对?
你之前写的ORDER BY IF (num_mojud = 0, 9999999, num_mojud )或者带两个CASE的语句,问题出在你让非0值按自身数值排序了。比如非0值会返回num_mojud本身,数据库就会把这些数值从小到大排列,这就是为什么你会得到按数值排序的结果,而不是保持原始顺序。
用上面的方法跑你的测试数据:
原始数据:1 0 5 2 0 3 3 5 0 5
排序后结果:1 5 2 3 3 5 5 0 0 0
完全符合你的要求!
内容的提问来源于stack exchange,提问作者Navid Abutorab
相关产品推荐
相关产品推荐

