小编典典

PostgreSQL:按列排序,具有特定的NON-NULL值LAST

sql

当我发现时NULLS LAST,我有点希望它可以CASEORDER BY查询部分的语句中泛化为“ X LAST” 。

事实并非如此。

我正在尝试按两列对表进行排序(简单),但是以特定的顺序(简单)获得输出,其中 一个特定值的一列最后出现 (完成它……很丑)。

假设这些列是zone并且status(不要怪我命名列zone-我没有给它们命名)。status仅采用2个值(“ U”和“
S”),而zone可以采用约100个值中的任何一个。

zone的值的一个子集是(在伪正则表达式中)IN[0-7]Z,而这些值在结果中排​​在第一位。使用可以很容易地做到这一点CASE

zone 也可以采用值’Future’,该值应在结果中显示为LAST。

以我典型的kludgy-munge方式,我简单地将CASE值设置为1000,如下所示:

group by zone, status
order by (
 case when zone='IN1Z' then 1
      when zone='IN2Z' then 2
      when zone='IN3Z' then 3
        .
        . -- other IN[X]Z etc
        .
      when zone = 'Future' then 1000
      else 11 -- [number of defined cases +1]
      end), zone, status

这行得通,但显然很麻烦,我想知道是否可能有一个班轮做同样的事情。
有没有更清洁的方法来达到相同的结果?


阅读 162

收藏
2021-04-28

共1个答案

小编典典

Postgres允许booleanORDER BY子句中使用值,因此这是您的generalised 'X LAST'

ORDER BY (my_column = 'X')

表达式的计算结果为boolean,结果值按以下方式排序:

FALSE (0)
TRUE (1)
NULL

由于我们处理非null值,这就是我们所需要的。这是您的一线客:

...
ORDER BY (zone = 'Future'), zone, status;
2021-04-28