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

时间:2012-03-01 04:11:33

标签: sql postgresql null sql-order-by

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

但是该字段可以为空或为空,我希望在last_updated 非空last_updated之前来自的记录为空。
这可能吗?

order by last_updated asc /* and null last_updated records first ?? */

2 个答案:

答案 0 :(得分:129)

Postgres为ORDER BY子句提供了NULLS FIRST | LAST个关键字,以满足这种需求:

... 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 :(得分: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;