按列 ASC 排序,但首先为 NULL 值?

Sort by column ASC, but NULL values first?

提问人:mhd 提问时间:3/1/2012 最后编辑:Erwin Brandstettermhd 更新时间:3/27/2023 访问量:70274

问:

我需要按日期/时间字段升序对PostgreSQL表进行排序,例如.last_updated

但是该字段允许为空或 null,我希望 null 的记录在非 null 之前
这可能吗?
last_updatedlast_updated

order by last_updated asc  -- and null last_updated records first ??
postgresql null sql-order-by

评论


答:

21赞 mechanical_meat 3/1/2012 #1

您可以使用 CASE 语句创建自定义 ORDER。
CASE 语句检查您的条件,并为满足该条件的行分配一个低于分配给不满足该条件的行的值。
举个例子,可能最容易理解:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;

评论

1赞 mechanical_meat 3/1/2012
另外,但您可能知道这一点,这是默认的排序顺序,因此您不一定需要键入它。ASC
4赞 9/25/2014
NULLS FIRST也是符合 ANSI 的先写入 null 的方法。
3赞 KajMagnus 12/23/2015
@a_horse_with_no_name 这在我的情况下很有用,因为如果该值不为 null,我想忽略该值,然后改为按另一列排序。(我正在对通知进行排序 - 先看不见(然后),但如果看到,那么我按 instaed 排序)seenAt is nullcreatedAt
3赞 Ben Kreeger 1/9/2016
同意;我发现这很有趣,当只想按是否存在一个值(在本例中为日期)进行排序时,然后按另一个值进行排序。 如果值为非 null,则仍按实际值排序。这对我来说很有帮助。谢谢!NULLS FIRST
1赞 Koushik Das 7/10/2021
这是最好的解决方案。可以与其他任何东西一起使用,例如,然后 0 else 1 ...deleted_at >= xyz time
239赞 Erwin Brandstetter 3/1/2012 #2

Postgres 具有 NULLS FIRST |表达式的 LAST 修饰符:ORDER BY

... ORDER BY last_updated NULLS FIRST

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

... ORDER BY last_updated DESC NULLS LAST

若要使用索引支持查询,请使其匹配:

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

Postgres 可以向后读取 btree 索引,因此这实际上与以下几步几乎相同:

CREATE INDEX foo_idx ON tbl (last_updated);

对于某些查询计划,附加值的位置很重要。看:NULL

评论

32赞 ibrewster 7/23/2013
我做了。这就是我得到这个页面的方式:)
2赞 Brad 7/9/2020
谢谢你的回答。SQLite3 添加了此功能,在使用它之前,我想确保它与 PostgreSQL 兼容。事实证明,这已经是现在的标准做法了!
3赞 Ivan Rubinson 6/24/2021
值得注意的是:是 的默认值 ,是 的默认值。NULLS FIRSTDESCNULLS LASTASC