MySQL中如何按整数排序并将NULL置于正数与负数之间?
实现自定义排序:正数降序 → NULL → 负数升序
这需求很明确,咱们先拆解下排序规则:
- 正数按降序排列(4,3,2)
- NULL放在正数之后、负数之前
- 负数按升序排列(-1,-2,-4)
核心思路
通过ORDER BY结合CASE语句,分两步实现:
- 给不同类型的值分配优先级,确定整体的分组顺序(正数→NULL→负数)
- 在每个分组内部应用对应的排序规则(正数降序、负数升序)
具体SQL实现
假设你的列名为num,表名为your_table,可以用以下查询:
SELECT num FROM your_table ORDER BY -- 第一步:分组确定整体顺序 CASE WHEN num > 0 THEN 1 -- 正数组优先级最高(排最前面) WHEN num IS NULL THEN 2 -- NULL组次之 ELSE 3 -- 负数组优先级最低(最后排) END, -- 第二步:组内单独排序 CASE WHEN num > 0 THEN num END DESC, -- 正数按值降序 CASE WHEN num < 0 THEN num END ASC; -- 负数按值升序
验证效果
我们先创建测试表并插入你的数据:
CREATE TABLE test_num (num INT); INSERT INTO test_num VALUES (3),(2),(NULL),(4),(-1),(-4),(-2);
执行上面的查询后,返回结果正好是你想要的:
4 3 2 NULL -1 -2 -4
简化写法(可选)
如果觉得多个CASE有点繁琐,也可以用IF函数合并组内排序逻辑,效果完全一致:
SELECT num FROM your_table ORDER BY CASE WHEN num > 0 THEN 1 WHEN num IS NULL THEN 2 ELSE 3 END, IF(num > 0, -num, num);
这里正数用-num是因为按-num升序等价于按num降序,负数直接用num升序即可。
内容的提问来源于stack exchange,提问作者PROSUN HALDER
相关产品推荐
相关产品推荐

