【问题标题】:Order by null first, then order by other variable先按 null 排序,再按其他变量排序
【发布时间】:2012-12-13 08:34:01
【问题描述】:

这是我现在的代码:

SELECT id, number
FROM Media
WHERE user = 10
ORDER BY id, number

但我希望它看起来像:

SELECT id, number
FROM Media
WHERE user = 10
ORDER BY while(number IS NULL), id

我想要做的是将所有number 放在结果的顶部,但number 不是NULL,按id 排序

这可能吗?

我用mysql。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这样的事情怎么样:

    SELECT id, number
    FROM Media
    WHERE user = 10
    ORDER BY (case when number is null then 0 else 1 end), id
    

    如果 number 为 NULL,则按条件的第一个 order 将为 0 ;否则 1
    这意味着每一行都会编号 NULL 将排在其他行之前

    请注意,无论如何,id 也会被排序。

    你会得到这样的东西:

    • 编号为空; id=1
    • 编号为空; id=2
    • 编号为空; id=5
    • 编号为空; id=8
    • 数字不为空; id=3
    • 数字不为空; id=4
    • 数字不为空; id=7
    • 数字不为空; id=10
    • 数字不为空; id=12

    【讨论】:

    • 我平时也是这样的。
    • 太棒了!快速回答,我第一次尝试就奏效了。谢谢!
    【解决方案2】:

    如果参数为空,ISNULL() 函数返回 1,否则返回 0。

    SELECT id, number
    FROM Media
    WHERE user = 10
    ORDER BY ISNULL(number) DESC, id
    

    请注意,性能很糟糕,具体取决于它需要订购多少个值:不会使用基于 ORDER BY 列的索引。

    【讨论】:

      【解决方案3】:

      也可以使用联合。

      SELECT id, number
      FROM Media
      WHERE user = 10 AND number IS NULL
      ORDER BY id
      
      UNION
      
      SELECT id, number
      FROM Media
      WHERE user = 10 AND number IS NOT NULL
      ORDER BY id, number;
      

      【讨论】:

      • 除了稍微错误的语法(缺少括号)之外,这没有任何意义,因为UNION 不能保证保留单个选择的顺序。此外,这会产生不必要的昂贵执行计划(NULLnumber 列进行两次检查)。
      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      相关资源
      最近更新 更多