El tipo de dato JSONB de PostgreSQL facilita el manejo de datos JSON dentro de tu base de datos. Sus capacidades van más allá del simple almacenamiento: ofrece funciones avanzadas para manipular y consultar datos JSON a detalle. En esta guía exploraremos estas funciones JSONB con ejemplos prácticos para que aproveches todo el poder de PostgreSQL al gestionar datos JSON.
Para una visión más amplia de cómo trabajar con JSON en PostgreSQL, incluyendo los tipos json y jsonb, consulta nuestra guía completa de funciones JSON en PostgreSQL.
Introducción a JSONB
El tipo de dato jsonb en PostgreSQL es un formato binario que almacena datos JSON. Es muy eficiente y ofrece capacidades de indexación que json no tiene. En general, JSONB es preferible por su flexibilidad y sus ventajas de rendimiento.
Crear una tabla con JSONB
Empecemos creando una tabla que use el tipo de dato jsonb:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
data JSONB
);
Insertar datos JSONB
Inserta datos JSONB usando la sintaxis JSON estándar. PostgreSQL valida y convierte automáticamente el JSON a formato binario:
INSERT INTO users (data) VALUES
('{"name": "John Doe", "email": "john@example.com", "age": 30}'),
('{"name": "Jane Doe", "email": "jane@example.com", "age": 25}'),
('{"name": "Alice Smith", "email": "alice@example.com", "age": 28, "address": {"city": "New York", "state": "NY"}}');
Acceder a valores JSONB
PostgreSQL ofrece varios operadores para explorar los valores JSONB.
Extraer un objeto JSONB
Para acceder a valores JSONB anidados, usa los operadores -> y ->>. El operador -> devuelve datos en formato JSON, mientras que ->> devuelve texto.
SELECT data->'name' AS name, data->>'email' AS email FROM users;
Resultado esperado:
name | email
---------+--------------------
"John Doe" | john@example.com
"Jane Doe" | jane@example.com
Extraer valores JSONB anidados
Para estructuras JSON más profundas, encadena los operadores. El operador ? verifica primero que la clave exista:
SELECT
data->>'name' AS name,
data->'address'->>'city' AS city
FROM users
WHERE data ? 'address';
Resultado esperado:
name | city
-------------|----------
Alice Smith | New York
Funciones JSONB
PostgreSQL incluye un conjunto de funciones JSONB que van más allá de la simple extracción de valores.
Verificar si existe una clave
El operador ? verifica si una clave existe:
SELECT data ? 'age' AS has_age FROM users;
Resultado esperado:
has_age
---------
t
t
t
Verificar contención
Usa el operador @> para verificar si un objeto JSON contiene a otro:
SELECT * FROM users WHERE data @> '{"age": 30}';
Resultado esperado:
id | data
----+---------------------------------------------
1 | {"name": "John Doe", "email": "john@example.com", "age": 30}
Concatenación de JSONB
Combina columnas o valores JSONB con el operador ||:
SELECT data || '{"verified": false}' AS updated_data FROM users;
Resultado esperado:
updated_data
-------------------------------------------------------------------
{"age": 30, "name": "John Doe", "email": "john@example.com", "verified": false}
{"age": 25, "name": "Jane Doe", "email": "jane@example.com", "verified": false}
{"age": 28, "name": "Alice Smith", "email": "alice@example.com", "address": {"city": "New York", "state": "NY"}, "verified": false}
Eliminar una clave de JSONB
Elimina una clave con el operador -:
SELECT data - 'age' AS partial_data FROM users;
Resultado esperado:
partial_data
--------------------------------------------------------------------
{"name": "John Doe", "email": "john@example.com"}
{"name": "Jane Doe", "email": "jane@example.com"}
{"name": "Alice Smith", "email": "alice@example.com", "address": {"city": "New York", "state": "NY"}}
Indexación de JSONB
Para mejorar el rendimiento de las consultas sobre datos JSONB, usa índices.
Crear un índice JSONB
Un índice GIN es ideal para tipos JSONB:
CREATE INDEX idx_users_data ON users USING GIN (data);
Este índice ayuda a acelerar operaciones como buscar la existencia de claves JSON o de pares clave-valor.
Funciones JSONB avanzadas
PostgreSQL ofrece funciones adicionales para operaciones más complejas:
-- Convert JSONB to key-value pairs
SELECT jsonb_each_text(data) FROM users LIMIT 1;
-- Get all keys from a JSONB object
SELECT jsonb_object_keys(data) FROM users LIMIT 1;
-- Update a nested value using jsonb_set
UPDATE users
SET data = jsonb_set(data, '{address,zip}', '"10001"')
WHERE data ? 'address';
Conclusión
Las funciones JSONB de PostgreSQL ofrecen opciones potentes y flexibles para trabajar con datos JSON dentro de tu base de datos. Sus principales ventajas son:
- Rendimiento: formato de almacenamiento binario con indexación eficiente
-
Operadores completos: extracción y manipulación sencillas con
->,->>,@>,? -
Funciones avanzadas: operaciones complejas como
jsonb_set,jsonb_each_textyjsonb_array_elements - Soporte de indexación: índices GIN para consultas rápidas
Estas capacidades hacen de PostgreSQL una excelente opción para aplicaciones que necesitan almacenar y consultar datos JSON semiestructurados junto con datos relacionales tradicionales. Al dominar estas funciones JSONB, podrás crear aplicaciones de bases de datos más flexibles y eficientes.
Beekeeper Studio es un cliente de bases de datos gratuito y de código abierto
La mejor herramienta de consultas y edición de SQL que he usado. Tiene todo lo que necesito para administrar mi base de datos. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio es rápido, intuitivo y fácil de usar. Es compatible con muchísimas bases de datos y funciona de maravilla en Windows, Mac y Linux.
Lo que dicen los usuarios de Beekeeper Studio
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con SQL. Es rápido, intuitivo y hace que trabajar con bases de datos vuelva a ser agradable."
"He probado muchas GUI de bases de datos, pero Beekeeper logra el equilibrio perfecto entre funciones y simplicidad. Simplemente funciona."