我需要按日期/时间字段升序对PostgreSQL表进行排序,例如last_updated

但是该字段允许为空或null,我希望last_updated中具有null的记录出现在非null last_updated之前。
这可能吗?

order by last_updated asc  -- and null last_updated records first ??


评论

以防万一:postgresql.org/docs/9.0/static/queries-order.html

#1 楼

Postgres为NULLS FIRST | LAST子句提供了ORDER BY关键字,以完全满足该需求:首先反转具有空值的默认升序(DESC)。通常不理想-因此,最后保留空值:

... ORDER BY last_updated NULLS FIRST


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

... ORDER BY last_updated DESC NULLS LAST


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

评论


@mhd您不是Google的“ postgres首先将null排序”吗?

–大卫·奥尔德里奇(David Aldridge)
13年3月29日在14:33

是的那就是我得到这个页面的方式:)

–ibrewster
13年7月22日在20:09

感谢您的回答,PostgreSQL很棒。

–greatghoul
16年5月13日在8:14

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

–布拉德
7月8日18:15

#2 楼

您可以使用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;


评论


同样,但您可能知道这一点,ASC是默认的排序顺序,因此您不必一定要键入它。

–mechanical_meat
2012年3月1日下午4:29

NULLS FIRST也是ANSI兼容的首先写入null的方法。

– a_horse_with_no_name
2014年9月24日19:07

@a_horse_with_no_name在我的情况下很有用,因为如果值不为null,我想忽略该值,然后改为按另一列排序。 (我对通知进行排序-首先看不见(然后seeAt为null),但是如果看到,那么我将按createdAt instaed进行排序)

– KajMagnus
15年12月22日在22:16

同意;当我只想按一个值是否存在(在这种情况下是一个日期)进行排序,然后再按另一个值进行排序时,我发现这很有用。如果该值非空,则NULLS FIRST仍按实际值排序。这对我有用。谢谢!

– Ben Kreeger
16年1月8日在17:12