Tema SQL
jsonb_each() (PostgreSQL)
Convierte cada par clave-valor de un objeto jsonb en una fila (key, value). Familia jsonb_each_text para valores como texto; base para pivotar o unir metadatos JSON con tablas relacionales.
Descripción
jsonb_each(objeto) es un conjunto de retorno (key text, value jsonb). Útil para inspeccionar documentos heterogéneos, normalizar a EAV o aplicar reglas por clave. jsonb_each_text devuelve value como text. Para arrays usa jsonb_array_elements. En MySQL JSON_TABLE (8+) proyecta de forma parecida con sintaxis distinta; SQL Server OPENJSON. Combina con WHERE en key o value para filtrar antes de unir. Cuidado con objetos muy grandes: el coste es O(n) en número de claves.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
SELECT * FROM jsonb_each(objeto_jsonb);
SELECT * FROM jsonb_each_text(objeto_jsonb);
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- LATERAL
- Patrón FROM tabla, LATERAL jsonb_each(col) para cada fila.
- Tipos
- value sigue siendo jsonb salvo each_text.
- Orden
- El orden de claves puede no ser el de inserción; no dependas de él sin sort explícito.
Ejemplos
Ejemplo 1
SELECT * FROM jsonb_each('{"a":1,"b":2}'::jsonb);
SELECT t.id, e.key, e.value
FROM config t,
LATERAL jsonb_each(t.parametros) AS e;
Ejemplo 2
SELECT t.id, e.key, e.value
FROM config_app t,
LATERAL jsonb_each(t.flags) AS e;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.