Обычный
UNNEST() не сохраняет позицию элемента, что критично, когда важен порядок: восстановление списков, сортировка, работа с JSON-массивами.В PostgreSQL есть решение —
WITH ORDINALITY. Оно добавляет индекс элемента прямо при распаковке.Пример: распакуем массив ингредиентов с сохранением порядка:
SELECT recipe_id, ingredient, ord
FROM recipes,
UNNEST(ingredients) WITH ORDINALITY AS t(ingredient, ord);
В отличие от обычного
UNNEST(), здесь мы сразу получаем порядковый номер — без оконных функций и без дополнительных JOIN.Соберём обратно отсортированный список:
SELECT recipe_id,
STRING_AGG(ingredient, ', ' ORDER BY ord) AS ordered_list
FROM (
SELECT recipe_id, ingredient, ord
FROM recipes,
UNNEST(ingredients) WITH ORDINALITY t(ingredient, ord)
) q
GROUP BY recipe_id;
Работа с JSON-массивами:
SELECT order_id,
item ->> 'name' AS name,
item ->> 'price' AS price,
ord
FROM orders,
jsonb_array_elements(items) WITH ORDINALITY AS t(item, ord);
🔥 Используйте
WITH ORDINALITY в PostgreSQL, когда критична позиция элемента в массиве или JSON-списке.➡️ SQL Ready | #практика