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

MySQL中如何按整数排序并将NULL置于正数与负数之间?

实现自定义排序:正数降序 → NULL → 负数升序

这需求很明确,咱们先拆解下排序规则:

  • 正数按降序排列(4,3,2)
  • NULL放在正数之后、负数之前
  • 负数按升序排列(-1,-2,-4)

核心思路

通过ORDER BY结合CASE语句,分两步实现:

  1. 给不同类型的值分配优先级,确定整体的分组顺序(正数→NULL→负数)
  2. 在每个分组内部应用对应的排序规则(正数降序、负数升序)

具体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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:42:36