JSONsolo PostgreSQL

JSONB_ARRAY_ELEMENTS

Despliega un array JSON en filas: una fila por elemento.

Sintaxis

JSONB_ARRAY_ELEMENTS(<array json>)
JSONB_ARRAY_ELEMENTS_TEXT(<array json>)

Como UNNEST, pero para JSON: a partir de un array crea tantas filas como elementos tiene. Cada elemento sigue siendo jsonb; si necesitas texto, usa JSONB_ARRAY_ELEMENTS_TEXT. Útil cuando la aplicación guarda una lista en un campo JSON y en SQL hay que trabajar con ella como con una tabla.

Un array convertido en filas
SELECT JSONB_ARRAY_ELEMENTS('["sql", "postgres", "database"]') AS tag;
tag
sql
postgres
database

La tabla de resultados muestra sql sin comillas, pero cada elemento es jsonb: en psql se vería como "sql".

Objetos de un array convertidos en columnas
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
Como texto, para filtrar
SELECT tag
FROM JSONB_ARRAY_ELEMENTS_TEXT('["sql", "postgres"]') AS tag
WHERE tag LIKE 'p%';
tag
postgres

LIKE trabaja con texto, por eso aquí va _TEXT. Con el JSONB_ARRAY_ELEMENTS normal obtendrías operator does not exist: jsonb ~~ unknown.

Ten en cuenta

Los elementos siguen siendo jsonb, así que la comparación con texto se rompe: WHERE tag = 'sql' da el error invalid input syntax for type json. Usa JSONB_ARRAY_ELEMENTS_TEXT.

Si no es un array, error: con '{"a": 1}' obtendrás cannot extract elements from an object.

Un array vacío o NULL da cero filas, así que en una consulta con otra tabla esa fila desaparece, igual que con UNNEST.

Funciones relacionadas