CodeGym /Cursos /SQL SELF /Extracción de datos de objetos JSON

Extracción de datos de objetos JSON

SQL SELF
Nivel 33 , Lección 2
Disponible

JSONB es una herramienta potente que te deja guardar estructuras de datos complejas, como objetos anidados o arrays. Pero no basta con guardar datos en JSONB — hay que saber cómo sacarlos. Por ejemplo, imagina que tienes una columna data en la tabla users, donde se guardan todas las configuraciones del usuario en formato JSONB. ¿Quieres saber qué tema visual eligió el usuario? Toca extraerlo del objeto JSONB.

Si JSONB es un cofre del tesoro, los operadores ->, ->>, #>> y funciones como jsonb_extract_path() son tus llaves. Vamos a ver cómo usarlas.

Operadores básicos para trabajar con JSONB

En PostgreSQL hay varios operadores clave para trabajar con JSONB. Te permiten sacar valores de claves, objetos anidados y arrays. Aquí tienes los principales:

Operador ->

El operador -> saca un objeto o array por la clave que le digas. Si quieres el valor en el mismo formato que en JSON, este operador es el tuyo.

Ejemplo:

-- Ejemplo de datos
SELECT '{"name": "Alice", "age": 25}'::jsonb -> 'name';
-- Resultado: "Alice"

Operador ->>

El operador ->> es parecido a ->, pero devuelve el valor extraído como texto. Esto mola cuando quieres una versión simplificada en texto.

Ejemplo:

-- Ejemplo de datos
SELECT '{"name": "Alice", "age": 25}'::jsonb ->> 'age';
-- Resultado: "25" (cadena)

Operador #>>

El operador #>> saca datos de objetos anidados según la ruta que le pases. La ruta se pasa como un array de claves.

Ejemplo:

-- Ejemplo de datos
SELECT '{"user": {"name": "Bob", "details": {"age": 30}}}'::jsonb #>> '{user, details, age}';
-- Resultado: "30" (cadena)

Diferencia entre -> y ->>:

Si te importa mantener el tipo de dato (por ejemplo, array u objeto), usa ->. Si solo quieres texto, tira de ->>.

Uso de funciones para trabajar con JSONB

La función jsonb_extract_path() saca un valor de un objeto JSONB según la ruta que le digas. Es como el operador #>>, pero un poco más expresivo.

Ejemplo:

SELECT jsonb_extract_path('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- Resultado: "dark"

Si quieres el valor directamente como texto, usa jsonb_extract_path_text(). Funciona igual que jsonb_extract_path(), pero devuelve una cadena.

Ejemplo:

SELECT jsonb_extract_path_text('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- Resultado: dark

Ejemplos prácticos

Extracción de valor por clave. Supón que tenemos una tabla products, donde la columna details guarda datos en formato JSONB:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT,
    details JSONB
);

INSERT INTO products (name, details) VALUES
    ('Laptop', '{"brand": "Dell", "price": 1200, "specs": {"ram": "16GB", "cpu": "Intel i7"}}'),
    ('Phone', '{"brand": "Apple", "price": 1000, "specs": {"ram": "4GB", "cpu": "A13"}}');

Resultado:

id name details
1 Laptop {"brand": "Dell", "price": 1200, "specs": {"ram": "16GB", "cpu": "Intel i7"}}
2 Phone {"brand": "Apple", "price": 1000, "specs": {"ram": "4GB", "cpu": "A13"}}

Vamos a sacar las marcas de todos los productos.

SELECT name, details->'brand' AS brand FROM products;

Resultado:

name brand
Laptop "Dell"
Phone "Apple"

Extracción de valor de texto. Si quieres la marca sin comillas, usa el operador ->>:

SELECT name, details->>'brand' AS brand FROM products;

Resultado:

name brand
Laptop Dell
Phone Apple

Extracción de datos anidados. Vamos a sacar la cantidad de RAM (ram) de cada producto:

SELECT name, details#>>'{specs, ram}' AS ram FROM products;

Resultado:

name ram
Laptop 16GB
Phone 4GB

Extracción de datos por ruta. Lo mismo se puede hacer con la función jsonb_extract_path_text():

SELECT name, jsonb_extract_path_text(details, 'specs', 'ram') AS ram FROM products;

Resultado:

name ram
Laptop 16GB
Phone 4GB

Errores típicos y cómo evitarlos

Los errores suelen pasar cuando:

  • Intentas sacar datos por una ruta incorrecta. Por ejemplo, si la clave no existe, el resultado será null.
  • Usas el operador equivocado para la tarea. -> va bien para sacar objetos y arrays, pero para texto hay que usar ->>.

Ejemplo de error:

-- Error: la clave 'nonexistent' no existe
SELECT details->>'nonexistent' FROM products;
-- Resultado: null

Consejo: revisa siempre la estructura de los datos antes de escribir tus consultas para evitar errores.

Aplicación en tareas reales

Sacar datos de JSONB se usa en un montón de aplicaciones reales:

  • En e-commerce para trabajar con características de productos.
  • En apps web para guardar configuraciones de usuario.
  • En analítica para procesar datos estructurados como eventos y logs.

Aquí va otro ejemplo. Supón que tenemos una tabla orders, donde se guardan datos de pedidos:

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_name TEXT,
    items JSONB
);

INSERT INTO orders (customer_name, items) VALUES
    ('John', '[{"product": "Laptop", "quantity": 1}, {"product": "Mouse", "quantity": 2}]'),
    ('Alice', '[{"product": "Phone", "quantity": 1}]');

Vamos a sacar los nombres de todos los productos de los pedidos:

SELECT customer_name, jsonb_array_elements(items)->>'product' AS product FROM orders;

Resultado:

customer_name product
John Laptop
John Mouse
Alice Phone

En la siguiente parte vamos a profundizar en el trabajo con JSONB, explorando datos anidados y cómo convertirlos en un formato más cómodo para analizar. ¡Prepárate para descubrir cosas aún más interesantes!

2
Tarea
SQL SELF, nivel 33, lección 2
Bloqueada
Extracción de datos de un objeto JSON usando el operador `->`
Extracción de datos de un objeto JSON usando el operador `->`
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION