Postgresql 11 - порядок по целому индексу массива - PullRequest
1 голос
/ 05 января 2020

Я хочу перечислить мои продукты в базе данных в соответствии с порядком их идентификаторов в массиве

Мой массив

'{3,2,1}'::int[]

Например

SELECT id FROM product WHERE id = ANY ('{3,2,1}'::int[]);

Этот запрос получает продукты с заказанным по id продукта

|id|
|1 |
|2 |
|3 |

Но я хочу перечислить мои продукты, упорядоченные по индексу массива идентификаторов. Вот так:

|id|
|3 |
|2 |
|1 |

Возможно ли это сделать? Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 05 января 2020

Вы можете использовать array_position():

ORDER BY array_position('{3,2,1}'::int[], id)

Если вы не хотите повторять массив дважды:

select p.id
from product p join
     (values ('{3,2,1}'::int[])) v(ar)
     on p.id = any(v.ar)
order by array_position(v.ar, p.id);
1 голос
/ 05 января 2020

Вы можете unnest() массив с опцией WITH ORDINALITY, чтобы отслеживать индекс каждого элемента, объединить его с таблицей и использовать индекс как ORDER BY критерий:

SELECT p.id
FROM product AS p
INNER JOIN unnest('{3,2,1}'::int[]) WITH ORDINALITY AS a(id, nr) 
    ON p.id = a.id
ORDER BY a.nr;
...