【问题标题】:don't want to sort but want null values last不想排序但最后想要空值
【发布时间】:2012-06-28 19:45:56
【问题描述】:

我想按 id asc、date asc 排序,但在有 NULL 的情况下,我想要这些值 最后的。因此,在下面的示例中,我真的想 1. 按 id 排序,2. 按日期 asc 排序,其中 value 不为 null,然后 3) 按日期 asc 排序,最后列出值为 NULL 的行。

id  date       value
A12 6/21/2012  125
A12 6/15/2012  NULL
B11 5/28/2011  100
C12 4/23/2012  168

如何对 value 列进行排序,使 NULL 值排在最后,而不对非 null 值进行排序?

【问题讨论】:

  • 你自相矛盾。你说你想把 NULL 值放在最后而不对它们进行排序,但你还说你想按date ASC 排序,这将对 NULL 值进行排序。那么它是什么?
  • 也许这会有所帮助(尽管它对我不起作用)选择 * 其中值不为空 order by id ASC, date ASC UNION select * where value is null order by id ASC, date ASC;这将使所有具有非空值的行按日期排序,然后所有具有空值的行也按日期排序。

标签: sql tsql


【解决方案1】:

试试这个:

SELECT id, date, value
FROM mytable
ORDER BY id, (CASE WHEN value IS NULL THEN 1 ELSE 0 END), date

【讨论】:

  • 我试过了,但它不仅会将空值移到底部,还会对值列进行排序
  • +1,我认为您需要稍微调整一下顺序:id, case..., date。但其他明智的好。
  • @Barry - 它不应该对值列进行排序。 order by 子句有点乱。只需将 id 移到订单的前面即可。
  • 谢谢你们! @dbenham:你最后的评论让我再次尝试,这次成功了。
  • @dbenham 啊,我误解了他的要求。我以为他希望所有nulls 都在底部,然后按id 排序。但是,是的,很容易修复 - 感谢您的意见。
【解决方案2】:

在对非空值进行排序后,您可以使用UNION 运算符将空值附加到结果集的底部:

SELECT id, date, value
FROM tbl
WHERE value IS NOT NULL
ORDER BY id, date

UNION ALL

SELECT id, date, value
FROM tbl
WHERE value IS NULL
ORDER BY id, date

【讨论】:

  • 我用的是sybase;在第一次选择中使用 order by 时出现错误。
  • 我相信不仅仅是 sybase 会拒绝这种语法。同样作为一般规则,您永远不应依赖结果的顺序,除非最终结果有明确的 order by 子句。
猜你喜欢
  • 2013-08-29
  • 2017-09-18
  • 2012-04-14
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2015-02-18
相关资源
最近更新 更多