在PostgreSQL查询中,为什么NULL值在DESC排序时排在最前面?

13

当查询升序或降序排序时,您何时希望空值排在第一位?

我认为,在大多数情况下,无论是升序还是降序排序,期望的行为都应该是将空值排在最后。因此,我们应该要指定空值排在最前面。


1
据说SQL标准没有规定如何对NULL进行排序,因此这取决于将其写入Postgres的人:http://en.wikipedia.org/wiki/Order_by - Sam
你为什么想要首先使用null值? - Bryan
@usr 你能解释一下为什么在PostgreSQL查询中按DESC排序时,NULL值为什么排在前面是基于观点的吗? - Bryan
@Bryan 我认为 NULL 并不总是需要放在最前面或最后面。如果 NULL 是一个重要的异常或缺失数据,你可能想先向用户展示它们。如果它们代表的是不重要的情况,你可以将它们放在最后面展示。这完全取决于使用场景。(有趣的是,你的问题中包含了短语“在我看来” :) )。 - usr
如果空值是一个重要的异常情况 - 听起来像是一个边缘案例。我的“问题描述”中包含“在我看来”,但问题本身并没有。虽然我的描述基于个人观点,但问题并不是一个“基于观点的问题”。 - Bryan
2个回答

22

实际上,使用默认排序顺序(ASCENDING),NULL 值会排在最后。

逻辑推断,在使用关键字 DESCENDING 时应该反转排序顺序,这样 NULL 值会排在最前面。

但最好的部分是:你可以选择你想要的方式:

引用当前手册,截至撰写本文时为9.3版本:

如果指定了 NULLS LAST,则 NULL 值将排在所有非 NULL 值之后;如果指定了 NULLS FIRST,则 NULL 值将排在所有非 NULL 值之前。如果未指定,则默认行为为在指定或隐含 ASC 时为 NULLS LAST,在指定 DESC 时为 NULLS FIRST(因此,默认情况下,NULL 值被视为大于非 NULL 值)。当指定 USING 时,默认的 NULL 排序取决于运算符是小于还是大于运算符。

加粗部分为重点。


4
是合理的,降序应该是升序的反义词。同时,空值表示“没有值”,因此在任何有序列表的顶部都不应该出现空值。 - Bryan
1
@Bryan:这取决于你在做什么。有时候,让它们先进行处理是有意义的。真正的问题是如何在B树索引中放置空数据以及放置的位置。在Postgres中,决定将它们放在最后,因此反向索引查找会使它们首先出现。 - Denis de Bernardy

1
简单的答案是因为编写Postgres的人员是这样设计它的。引用

空值排序高于任何其他值。换句话说,在升序排列中,空值位于最后,在降序排列中,空值位于开头。

这假定您已经指定了ORDER BY子句,如果没有,则返回的行是随机的。

如果指定了ORDER BY子句,则返回的行按指定顺序排序。如果未给出ORDER BY,则系统以最快的方式返回行。


3
您引用的是非常老旧且不再受支持的8.2版本的手册。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接