我需要按照一个日期/时间字段(例如last_updated
)升序排序PostgreSQL表格。
但是该字段允许为空或为null,而我希望在last_updated
为null的记录排在非空last_updated
记录之前。
这个是否可能实现?
order by last_updated asc -- and null last_updated records first ??
我需要按照一个日期/时间字段(例如last_updated
)升序排序PostgreSQL表格。
但是该字段允许为空或为null,而我希望在last_updated
为null的记录排在非空last_updated
记录之前。
这个是否可能实现?
order by last_updated asc -- and null last_updated records first ??
Postgres在ORDER BY
表达式中有NULLS FIRST | LAST
修饰符:
... ORDER BY last_updated NULLS FIRST
典型的使用情况是降序排序(DESC
),这会完全颠倒默认的升序排序(ASC
),并将空值放在最前面 - 这通常是不可取的。要将NULL
值排在最后:
... ORDER BY last_updated DESC NULLS LAST
为了支持带有索引的查询,请让它匹配:
CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);
Postgres可以反向读取B树索引,因此实际上几乎与以下操作相同:
CREATE INDEX foo_idx ON tbl (last_updated);
对于某些查询计划,NULL
值的附加位置很重要。请参见:
您可以使用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_meatseenAt
为 null),但如果已看到,则按 createdAt
排序) - KajMagnusNULLS FIRST
仍然按实际值对非空值进行排序。这对我起到了作用。谢谢! - Ben Kreegerdeleted_at >= xyz time
,则为0,否则为1... - Koushik Das
NULLS FIRST
是DESC
的默认值,NULLS LAST
是ASC
的默认值。 - Ivan Rubinson