接收与主键数组匹配的记录,其顺序与它们在数组中出现的顺序相同

时间:2013-02-05 21:41:11

标签: sql arrays postgresql

我有主键列表/数组,现在我需要执行SQL查询以从表中获取与它们在数组中出现的顺序完全相同的顺序。例如:

| id |     text      |
| 1  | random data 1 |
| 2  | random data 2 |
| 3  | random data 3 |
| 4  | random data 4 |

此查询:

select * from sample where id in (2,4,1)

应该返回行:

| 2  | random data 2 |
| 4  | random data 4 |
| 1  | random data 1 |

在PostgreSQL 9.3中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

一种方式:

SELECT t.id, t.text
FROM (
   SELECT *, row_number() OVER () AS rn
   FROM  (
      SELECT unnest('{2,4,1}'::int[]) AS id
      ) x
   ) y
JOIN   tbl t USING (id)
ORDER  BY rn

诀窍是在ORDER BY之后将window function row_number()的行号用于JOIN。{ 查找更多方法(更安全的方法),详细解释和此closely related question on dba.SE下的链接。