Postgres 多列排序

Rob*_*son 3 postgresql query order-by

想象一下我有一个看起来像这样的结果集:

+----+------------+------------+
| Id |  Date_One  |  Date_Two  |
+----+------------+------------+
|  1 | 2022-05-12 | null       |
|  2 | 2022-05-13 | 2022-05-11 |
|  3 | null       | 2022-05-14 |
+----+------------+------------+
Run Code Online (Sandbox Code Playgroud)

我想首先根据最早的日期对结果进行排序,而不考虑列。每行将有一个Date_OneDate_Two填充。它们永远不会都为空。

因此上述结果集的结果将是:

+----+------------+------------+
| Id |  Date_One  |  Date_Two  |
+----+------------+------------+
|  2 | 2022-05-13 | 2022-05-11 |
|  1 | 2022-05-12 | null       |
|  3 | null       | 2022-05-14 |
+----+------------+------------+
Run Code Online (Sandbox Code Playgroud)

(因为 Id 2Date_Two早于 Id 1 Date_One)。

我不确定如何创建我的ORDER BY条款。我天真的解决方案是使用COALESCE,但这对于我的示例中的 ID 2 不起作用。

Che*_*ain 6

只需使用order by least(date_one, date_two)

least函数返回两个值中的最低值,巧合的是,您可以使用它greatest(date_one, date_two)来获取最高值。这也适用于null,但是如果两个值null显然都是,那么这些函数中的任何一个都会返回null,因为没有什么可比较的。

请记住,使用leastgreatest还会使您为排序这两列而创建的任何索引都无法使用,除非您使用 来将其创建为不可变函数的索引least/greatest。尽管我不确定这是否是您场景中的最佳举措。