Tema SQL
JSON_TABLE() (MySQL / MariaDB)
Proyecta documentos JSON a conjunto relacional de filas y columnas en una sola consulta (MySQL 8.0+). Similar en espíritu a JSON_TABLE estándar y a OPENJSON en SQL Server.
Descripción
JSON_TABLE(json_doc, path COLUMNS con PATH a rutas JSON tipo $.campo) permite unnest de arrays y extracción tipada. Combina con JOIN para cruzar tablas con JSON embebido. Errores de formato pueden abortar según ON ERROR/ON EMPTY si la versión lo soporta. Es preferible a múltiples JSON_EXTRACT cuando el esquema JSON es estable. Rendimiento: materializar solo columnas necesarias; índices sobre columnas generadas cuando sea posible.
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 tabla t,
JSON_TABLE(t.json_col, '$' COLUMNS (
id INT PATH '$.id',
nombre VARCHAR(100) PATH '$.nombre'
)) AS jt;
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.
- PATH
- Rutas JSON con comillas escapadas correctamente.
- NESTED
- Para arrays anidados según sintaxis soportada.
- SQL Server
- OPENJSON con WITH; PostgreSQL jsonb_to_recordset.
Ejemplos
Ejemplo 1
SELECT j.id, j.nombre
FROM pedidos p,
JSON_TABLE(p.meta, '$.lineas[*]' COLUMNS (
id INT PATH '$.linea_id',
nombre VARCHAR(80) PATH '$.desc'
)) AS j
WHERE p.id = 1001;
Ejemplo 2
SELECT j.sku, j.qty
FROM pedidos p,
JSON_TABLE(p.json_lineas, '$[*]' COLUMNS (sku VARCHAR(20) PATH '$.sku', qty INT PATH '$.qty')) AS j
WHERE p.id = 5;
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.