Оглядываясь вокруг, я не смог найти полное решение этого вопроса.
Я думаю, что лучшее решение - использовать этот запрос
SELECT *
FROM items
WHERE id IN (5,2,9)
ORDER BY idx(array[5,2,9]::integer[], items.id)
Если вы используете PostgreSQL> = 9.2, вы можете включить функцию idx, включающую расширение.
CREATE EXTENSION intarray;
В противном случае вы можете создать его следующим образом:
CREATE OR REPLACE FUNCTION idx(anyarray, anyelement)
RETURNS INT AS
$$
SELECT i FROM (
SELECT generate_series(array_lower($1,1),array_upper($1,1))
) g(i)
WHERE $1[i] = $2
LIMIT 1;
$$ LANGUAGE SQL IMMUTABLE;
Я действительно предлагаю использовать ::integer[]
в запросе, потому что, если вы создаете массив динамически, возможно, что в нем нет элементов, что приведет к ids(array[], items.id)
, что вызовет исключение в PostgreSQL.