我需要按日期/时间字段升序对PostgreSQL表进行排序,例如last_updated
。
但是,该字段允许为空或空,我想与空记录last_updated
来之前,非空last_updated
。
这可能吗?
order by last_updated asc -- and null last_updated records first ??
Answers:
PostgresNULLS FIRST | LAST
为该ORDER BY
子句提供关键字,以完全满足该需求:
... 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值的地方很重要。
您可以使用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
是默认的排序顺序,因此您不必一定要键入它。
NULLS FIRST
也是ANSI兼容的首先写入空值的方法。
seenAt is null
),但如果看到的话,我会按createdAt
即时排序)
NULLS FIRST
如果该值非空,则仍按实际值排序。这帮了我大忙。谢谢!