PostgreSQL按日期时间asc排序,先是null吗?

mhd*_*mhd 69 sql postgresql null sql-order-by

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

但是,该字段允许为空或空,我想与空记录last_updated之前,非空last_updated.
这可能吗?

order by last_updated asc /* and null last_updated records first ?? */
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 137

PostgreSQL提供了NULLS FIRST | LASTORDER BY子句的关键字,以满足该需求:

... ORDER BY last_updated NULLS FIRST
Run Code Online (Sandbox Code Playgroud)

典型的使用情况是与降序排序(DESC),其产生所述默认升序(完全反转ASC)与第一空值.通常不可取 - 所以,最后保持空值:

... ORDER BY last_updated DESC NULLS LAST
Run Code Online (Sandbox Code Playgroud)

要使用索引支持查询,请使其匹配:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);
Run Code Online (Sandbox Code Playgroud)

Postgres可以向后读取btree索引,但重要的是附加NULL值.

  • 我做到了.这就是我得到这个页面:) (15认同)
  • 值得注意的是:“DESC”默认为“NULLS FIRST”,“ASC”默认为“NULLS LAST”。 (3认同)
  • 感谢你的回答。SQLite3 添加了此功能,在使用它之前,我想确保它与 PostgreSQL 兼容。事实证明,这是当今的标准事情! (2认同)

ber*_*nie 8

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

  • NULLS FIRST也是ANSI兼容的首先写入null的方式。 (2认同)
  • @a_horse_with_no_name它在我的情况下很有用,因为如果它不为null,我想忽略该值,然后按另一列进行排序.(我排序通知 - 首先看不见(然后`seenAt为null`),但如果看到,那么我按`createdAt` instaed排序) (2认同)
  • 同意; 我只是想根据是否存在一个值(在这种情况下,是一个日期)进行排序,然后再次按另一个值排序,我觉得这很有用.如果值为非null,则"NULLS FIRST"仍然按实际值排序.这对我有用.谢谢! (2认同)