按ASC列排序,但先使用NULL值?


Answers:


161

PostgresNULLS FIRST | LAST为该ORDER BY子句提供关键字,以完全满足该需求:

... ORDER BY last_updated NULLS FIRST

典型的使用情况是与降序排序(DESC),其产生所述默认升序(完全反转ASC)具有空值的第一位。通常不理想-因此,将空值保留在最后:

... ORDER BY last_updated DESC NULLS LAST

要支持带有索引的查询,请使其匹配:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);

Postgres可以向后读取btree索引,但是在附加NULL值的地方很重要。


1
@mhd您不是Google的“ postgres首先将null排序”吗?
David Aldridge 2013年

25
是的 这就是我获得此页面的方法:)
ibrewster

2
感谢您的回答,PostgreSQL很棒。
greatghoul '16

1
谢谢你的回答。SQLite3添加了此功能,在使用它之前,我想确保它与PostgreSQL兼容。事实证明这是最近的标准!
布拉德(Brad)

13

您可以使用CASE语句创建自定义ORDER BY。
CASE语句检查您的条件,并为满足该条件的行分配一个比为其分配给不满足条件的行更低的值。
举个例子,这可能是最容易理解的:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;

1
另外,但您可能知道,这ASC是默认的排序顺序,因此您不必一定要键入它。
mechanical_meat

3
NULLS FIRST也是ANSI兼容的首先写入空值的方法。
a_horse_with_no_name 2014年

3
@a_horse_with_no_name在我的情况下很有用,因为如果值不为null,我想忽略该值,然后改为按另一列排序。(我正在整理通知-先看不见(然后seenAt is null),但如果看到的话,我会按createdAt即时排序)
KajMagnus

3
同意;当我只想按一个值是否存在(在这种情况下是一个日期)进行排序,然后再按另一个值进行排序时,我发现这很有用。NULLS FIRST如果该值非空,则仍按实际值排序。这帮了我大忙。谢谢!
本·克里格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.