postgresql 按列ASC排序,但NULL值优先?

aelbi1ox  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(133)

我需要按日期/时间字段升序对PostgreSQL表进行排序,例如last_updated
但是该字段允许为空或null,我希望last_updated中的null记录在 * 非null last_updated之前。
这可能吗?

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

pbpqsu0x1#

Postgres对ORDER BY表达式有**NULLS FIRST | LAST**修饰符:

... ORDER BY last_updated NULLS FIRST

*典型的*用例是降序排序(DESC),这会产生默认升序(ASC)的完全反转,首先是空值-这通常是不可取的。要最后排序NULL值:

... ORDER BY last_updated DESC NULLS LAST

要支持带有index的查询,请匹配:

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

Postgres可以反向读取btree索引,所以这实际上几乎与以下代码相同:

CREATE INDEX foo_idx ON tbl (last_updated);

对于某些查询计划,NULL值附加在何处很重要。请参阅:

  • 视图对聚合函数与结果集限制的性能影响
p8h8hvxi

p8h8hvxi2#

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

相关问题