Как сортировать по определенному заказу

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

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)

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

Ответ 1

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

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

Ответ 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.