Как отсортировать по определенному заказу - PullRequest
12 голосов
/ 03 января 2012

Пользователи таблиц:

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)

Можно ли это сделать, и в таком случае как?

Ответы [ 2 ]

20 голосов
/ 03 января 2012

Должен работать с CASE в следующем порядке:

SELECT * 
FROM users 
ORDER BY case id when 2 then 1
                 when 3 then 2
                 when 1 then 3
         end
0 голосов
/ 03 января 2012

Общее решение для 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

% - это оператор по модулю .

...