postgresql 按WHERE子句中的项对查询结果进行排序[duplicate]

xytpbqjk  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(2)|浏览(191)

此问题在此处已有答案

ORDER BY the IN value list(17个答案)
3天前关闭。
如何让查询结果按照WHERE子句中传递的项的确切顺序进行排序?
例如,使用以下查询:

SELECT id, name FROM my_table
WHERE id in (1,3,5,2,4,6)
ORDER BY id

结果:

id | name
---------
1  |  a
2  |  b
3  |  c
4  |  d
5  |  e
6  |  f

我所期望的:

id | name
---------
1  |  a
3  |  c
5  |  e
2  |  b
4  |  d
6  |  f

我注意到MySQL中有一个FIELD()函数。PostgreSQL中有等价的函数吗?

5ssjco0h

5ssjco0h1#

传递一个数组并使用WITH ORDINALITY。这是最干净和最快的:

SELECT id, t.name
FROM   unnest ('{1,3,5,2,4,6}'::int[]) WITH ORDINALITY u(id, ord)
JOIN   my_table t USING (id)
ORDER  BY u.ord;

假设所传递数组中的值是不同的。否则,这个解决方案保留重复值,而IN删除它们。您必须定义您想要的行为。但是所需的排序顺序也是不明确的,这将使这个问题变得没有意义。
请参阅:

  • ORDER BY IN值列表
  • PostgreSQL unnest()与元素编号
ljsrvy3e

ljsrvy3e2#

@chris Kao,使用postgresql中的位置。

*方法:1 SELECT标识,名称 * FROM my_table WHERE标识在(1,3,5,2,4,6)中按位置排序(标识::文本在'1,3,5,2,4,6'中)输出:

id|name|
--+----+
 1|a   |
 3|c   |
 5|e   |
 2|b   |
 4|d   |
 6|f   |

方法:二

select id, name
from my_table mt
where id in (1,3,5,2,4,6)
order by array_position(array[1,3,5,2,4,6], mt.id);

相关问题