JSONлише PostgreSQL

JSONB_ARRAY_ELEMENTS

Розгортає JSON-масив у рядки — по рядку на кожен елемент.

Синтаксис

JSONB_ARRAY_ELEMENTS(<json-масив>)
JSONB_ARRAY_ELEMENTS_TEXT(<json-масив>)

Як UNNEST, але для JSON: з одного масиву робить стільки рядків, скільки в ньому елементів. Кожен елемент лишається jsonb; якщо потрібен текст, бери JSONB_ARRAY_ELEMENTS_TEXT. Зручно, коли застосунок зберігає список у JSON-полі, а в SQL з ним треба працювати як з таблицею.

Масив — у рядки
SELECT JSONB_ARRAY_ELEMENTS('["sql", "postgres", "database"]') AS tag;
tag
sql
postgres
database

Таблиця результату показує sql без лапок, але кожен елемент — це jsonb: у psql він виглядав би як "sql".

Об'єкти з масиву — у стовпці
SELECT item ->> 'name' AS name,
(item ->> 'salary')::int AS salary
FROM JSONB_ARRAY_ELEMENTS('[{"name": "Emma", "salary": 1200}, {"name": "Liam", "salary": 1000}]') AS item;
namesalary
Emma1200
Liam1000
Текстом — щоб фільтрувати
SELECT tag
FROM JSONB_ARRAY_ELEMENTS_TEXT('["sql", "postgres"]') AS tag
WHERE tag LIKE 'p%';
tag
postgres

LIKE працює з текстом, тому тут _TEXT. Зі звичайним JSONB_ARRAY_ELEMENTS була б помилка operator does not exist: jsonb ~~ unknown.

Зверни увагу

Елементи лишаються jsonb, тож порівняння з текстом ламається: WHERE tag = 'sql' дасть помилку invalid input syntax for type json. Бери JSONB_ARRAY_ELEMENTS_TEXT.

Не масив — помилка: для '{"a": 1}' буде cannot extract elements from an object.

Порожній масив чи NULL дає нуль рядків, тож у запиті з іншою таблицею такий рядок зникне, як і з UNNEST.

Схожі функції