按列升序排序,但将NULL值放在前面?

8 浏览
0 Comments

按列升序排序,但将NULL值放在前面?

我需要按照一个日期/时间字段(例如 last_updated)对一个 PostgreSQL 表进行升序排序。\n但是该字段允许为空或为 null,并且我希望具有 null 值的记录排在非 null 值的记录之前。
\n这种排序是否可能?\n

order by last_updated asc  -- 并且 null 值的 last_updated 记录排在前面??

0
0 Comments

问题出现的原因:

在进行排序时,希望将NULL值排在前面,而非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标准的写法,表示将NULL值排在前面。

以下是一些评论中的具体应用案例:

_horse_with_no_name:在我的情况中非常有用,因为我希望忽略非NULL值,然后按另一列进行排序(我正在对通知进行排序,未查看的通知排在前面(即seenAt为NULL),如果已查看,则按createdAt排序)

赞同;当只想按值是否存在进行排序时(在这种情况下是日期),然后再按另一个值进行次要排序时,我发现这很有用。NULLS FIRST仍然会按实际值进行排序,如果值为非NULL。这对我起到了作用。谢谢!

这是最好的解决方案。可以与其他内容一起使用,例如deleted_at >= xyz time,然后是0,否则是1...

文章整理如下:

在进行排序时,通常情况下,我们希望按照某一列的升序或降序来排列数据。然而,在某些情况下,我们可能希望将NULL值排在前面,而非NULL值排在后面。那么,如何实现这样的排序呢?

可以使用CASE语句创建自定义的ORDER BY子句来解决这个问题。CASE语句会检查条件,并为满足条件的行赋予一个较低的值,而不满足条件的行则赋予一个较高的值。通过将NULL值的排序值设置为较低的值,我们可以将其排在前面。以下是一个示例:

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

在这个示例中,我们首先使用CASE语句将NULL值赋予0,非NULL值赋予1。然后,我们按照last_updated列进行升序排序。

需要注意的是,ASC是默认的排序顺序,因此在这种情况下,我们不一定需要输入它。

另外,NULLS FIRST是ANSI标准的写法,表示将NULL值排在前面。

在实际应用中,这种排序方式也被证明非常有用。比如,当我们希望按照值是否存在进行排序时,可以先将NULL值排在前面,然后再按另一列进行排序。例如,在对通知进行排序时,可以先将未查看的通知排在前面(即seenAt为NULL),然后再按照创建时间(createdAt)进行排序。

通过使用CASE语句和自定义的ORDER BY子句,我们可以实现将NULL值排在前面的排序需求。这种方法在实际应用中非常实用,可以根据具体情况灵活调整排序规则。

0
0 Comments

在PostgreSQL中,ORDER BY表达式有一个NULLS FIRST | LAST修饰符。典型的用例是带有降序排序(DESC),它会将默认的升序排序(ASC)完全反转,并将空值放在首位,这通常是不希望的。为了将NULL值放在最后进行排序,可以使用以下语句:... ORDER BY last_updated DESC NULLS LAST

如果想要支持带有索引的查询,则需要使其匹配。可以使用以下语句创建一个索引:CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);。PostgreSQL可以反向读取btree索引,因此这几乎与以下语句相同:CREATE INDEX foo_idx ON tbl (last_updated);

对于某些查询计划,NULL值的附加位置很重要。请参考:Performance impact of view on aggregate function vs result set limiting

有一个用户提到,SQLite3也添加了这个功能,但在使用之前,他想确保它与PostgreSQL兼容。结果证明,这是现在标准的做法!

值得注意的是,默认情况下,NULLS FIRST适用于DESC,而NULLS LAST适用于ASC

0