【问题标题】:How do I sort by a specific order如何按特定顺序排序
【发布时间】:2012-02-01 13:14:24
【问题描述】:

表用户:

id | firstname | lastname
---+-----------+---------
 1 | John      | Smith
 2 | Adam      | Tensta
 3 | Anna      | Johansson

我想按 ID 2、3、1 的顺序选择这些。仅由 id 字段指定。这可能吗?

我在想类似SELECT * FROM users ORDER BY id ORDER(2,3,1)

这可以做到吗?在这种情况下怎么做?

【问题讨论】:

  • 您尝试实现的顺序按名字的字母顺序排列只是巧合吗?或者数据中是否有其他指标可以为您提供所需的顺序?按 ID 任意排序似乎很奇怪。
  • 这只是一个巧合,想法是仅基于ID进行排序。这可能有几个原因。例如用户指定的顺序,由应用程序中另一层上的另一个结果集排序,而不是数据库等。

标签: sql postgresql sql-order-by


【解决方案1】:

应按以下顺序使用 CASE:

SELECT * 
FROM users 
ORDER BY case id when 2 then 1
                 when 3 then 2
                 when 1 then 3
         end

【讨论】:

  • 不错的解决方案。刚刚在 Oracle 上测试过,不确定它是否适用于 Postgres。
  • @Jules: 应该适用于任何数据库。那是符合 ANSI 的 SQL
【解决方案2】:

Postgres 9.4 或更高版本的通用解决方案

对于任意数量的值。只需使用您喜欢的排序顺序传递一个匹配类型的数组:

SELECT u.*
FROM   users u
LEFT   JOIN unnest('{2,3,1}'::int[]) WITH ORDINALITY o(id, ord) USING (id)
ORDER  BY o.ord;

这会将不匹配的行排在最后,因为 ord 是 NULL,然后按升序排在最后。

没有ORDINALITY 的旧版本也可以使用类似的解决方案。

相关:

给定简单案例的原始答案

SELECT * FROM users ORDER BY (id+1)%3

%modulo operator

【讨论】:

  • 这在此数据集上有效,但我希望能够按 ID 列上的任何给定顺序进行排序。有趣的解决方案。 :)
  • @Lilleman:我知道这个问题很老了,但是当我刚刚偶然发现它时,我不得不添加一个通用的解决方案。
  • @ErwinBrandstetter 非常感谢您编辑此内容 - 您添加的通用解决方案正是我所需要的。 :)
猜你喜欢
  • 2018-03-28
  • 2014-08-17
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多