You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:55