我需要按日期/时间字段对PostgreSQL表进行排序,例如: last_updated
。
但是该字段可以为空或为空,我希望在last_updated
非空last_updated
之前来自的记录为空。
这可能吗?
order by last_updated asc /* and null last_updated records first ?? */
答案 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;