Com o Postgres 9.4, isso pode ser feito um pouco mais curto:
select c.*
from comments c
join (
select *
from unnest(array[43,47,42]) with ordinality
) as x (id, ordering) on c.id = x.id
order by x.ordering;
Ou um pouco mais compacto sem uma tabela derivada:
select c.*
from comments c
join unnest(array[43,47,42]) with ordinality as x (id, ordering)
on c.id = x.id
order by x.ordering
Removendo a necessidade de atribuir / manter manualmente uma posição para cada valor.
Com o Postgres 9.6, isso pode ser feito usando array_position()
:
with x (id_list) as (
values (array[42,48,43])
)
select c.*
from comments c, x
where id = any (x.id_list)
order by array_position(x.id_list, c.id);
O CTE é usado para que a lista de valores precise ser especificada apenas uma vez. Se isso não for importante, também pode ser escrito como:
select c.*
from comments c
where id in (42,48,43)
order by array_position(array[42,48,43], c.id);