PostgreSQL:按列排序,具有特定的 NON-NULL 值 LAST
PostgreSQL: order by column, with specific NON-NULL value LAST
当我发现 NULLS LAST
时,我有点希望它可以在查询的 ORDER BY
部分的 CASE
语句中泛化为 'X LAST'。
似乎不是这样。
我正在尝试按两列对 table 进行排序(简单),但按特定顺序获取输出(简单),显示一列的一个特定值最后(搞定了……丑)。
假设列是 zone
和 status
(不要怪我将列命名为 zone
- 我没有给它们命名)。 status
只取 2 个值('U' 和 'S'),而 zone
可以取大约 100 个值中的任何一个。
zone
值的一个子集是(在伪正则表达式中)IN[0-7]Z
,它们在结果中排在第一位。使用 CASE
.
很容易做到这一点
zone
也可以取值 'Future',它应该在结果中出现在最后。
以我典型的 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
这行得通,但这显然是一种拼凑,我想知道是否有 one-liner 在做同样的事情。
有没有更简洁的方法来达到相同的结果?
我不是特别熟悉 postgreSQL,但我在 MS SQL 服务器中遇到过类似的问题。据我所知,解决此类问题的唯一 "nice" 方法是创建一个单独的 table 区域值并为每个区域值分配一个排序顺序。
例如,我们调用 table ZoneSequence:
Zone | Sequence
------ | --------
IN1Z | 1
IN2Z | 2
IN3Z | 3
Future | 1000
等等。然后您只需将 ZoneSequence 连接到您的查询中,并按 Sequence 列排序(确保添加好的索引!)。
这种方法的好处是,当创建新的区域代码时,它很容易维护,因为它们很可能会如此。
Postgres 允许在 ORDER BY
子句中使用 boolean
值,所以这里是你的 generalised 'X LAST'
:
ORDER BY (my_column = 'X')
表达式的计算结果为 boolean
,结果值按此方式排序:
FALSE (0)
TRUE (1)
NULL
由于我们处理非空值,这就是我们所需要的。这是您的单行本:
...
ORDER BY (zone = 'Future'), zone, status;
相关:
- Sorting null values after all others, except special
- Select query but show the result from record number 3
- SQL two criteria from one group-by
当我发现 NULLS LAST
时,我有点希望它可以在查询的 ORDER BY
部分的 CASE
语句中泛化为 'X LAST'。
似乎不是这样。
我正在尝试按两列对 table 进行排序(简单),但按特定顺序获取输出(简单),显示一列的一个特定值最后(搞定了……丑)。
假设列是 zone
和 status
(不要怪我将列命名为 zone
- 我没有给它们命名)。 status
只取 2 个值('U' 和 'S'),而 zone
可以取大约 100 个值中的任何一个。
zone
值的一个子集是(在伪正则表达式中)IN[0-7]Z
,它们在结果中排在第一位。使用 CASE
.
zone
也可以取值 'Future',它应该在结果中出现在最后。
以我典型的 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
这行得通,但这显然是一种拼凑,我想知道是否有 one-liner 在做同样的事情。
有没有更简洁的方法来达到相同的结果?
我不是特别熟悉 postgreSQL,但我在 MS SQL 服务器中遇到过类似的问题。据我所知,解决此类问题的唯一 "nice" 方法是创建一个单独的 table 区域值并为每个区域值分配一个排序顺序。
例如,我们调用 table ZoneSequence:
Zone | Sequence
------ | --------
IN1Z | 1
IN2Z | 2
IN3Z | 3
Future | 1000
等等。然后您只需将 ZoneSequence 连接到您的查询中,并按 Sequence 列排序(确保添加好的索引!)。
这种方法的好处是,当创建新的区域代码时,它很容易维护,因为它们很可能会如此。
Postgres 允许在 ORDER BY
子句中使用 boolean
值,所以这里是你的 generalised 'X LAST'
:
ORDER BY (my_column = 'X')
表达式的计算结果为 boolean
,结果值按此方式排序:
FALSE (0)
TRUE (1)
NULL
由于我们处理非空值,这就是我们所需要的。这是您的单行本:
...
ORDER BY (zone = 'Future'), zone, status;
相关:
- Sorting null values after all others, except special
- Select query but show the result from record number 3
- SQL two criteria from one group-by