我需要按日期/时间字段升序对PostgreSQL表进行排序,例如last_updated。但是该字段允许为空或null,我希望last_updated中的null记录在 * 非null last_updated之前。这可能吗?
last_updated
order by last_updated asc -- and null last_updated records first ??
pbpqsu0x1#
Postgres对ORDER BY表达式有**NULLS FIRST | LAST**修饰符:
ORDER BY
NULLS FIRST | LAST
... ORDER BY last_updated NULLS FIRST
*典型的*用例是降序排序(DESC),这会产生默认升序(ASC)的完全反转,首先是空值-这通常是不可取的。要最后排序NULL值:
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值附加在何处很重要。请参阅:
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;
2条答案
按热度按时间pbpqsu0x1#
Postgres对
ORDER BY
表达式有**NULLS FIRST | LAST
**修饰符:*典型的*用例是降序排序(
DESC
),这会产生默认升序(ASC
)的完全反转,首先是空值-这通常是不可取的。要最后排序NULL
值:要支持带有index的查询,请匹配:
Postgres可以反向读取btree索引,所以这实际上几乎与以下代码相同:
对于某些查询计划,
NULL
值附加在何处很重要。请参阅:p8h8hvxi2#
可以使用CASE语句创建自定义ORDER BY。
CASE语句检查您的条件,并为满足该条件的行分配一个比分配给不满足该条件的行的值小的值。
举一个例子可能最容易理解: