提问人:mhd 提问时间:3/1/2012 最后编辑:Erwin Brandstettermhd 更新时间:3/27/2023 访问量:70274
按列 ASC 排序,但首先为 NULL 值?
Sort by column ASC, but NULL values first?
问:
我需要按日期/时间字段升序对PostgreSQL表进行排序,例如.last_updated
但是该字段允许为空或 null,我希望 null 的记录在非 null 之前。
这可能吗?last_updated
last_updated
order by last_updated asc -- and null last_updated records first ??
答:
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 null
createdAt
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 FIRST
DESC
NULLS LAST
ASC
评论