Tema SQL
JSON_EXTRACT() (MySQL / MariaDB)
Extrae un fragmento de un documento JSON por ruta (p. ej. $.nombre o $[0]). Devuelve un valor JSON con comillas si es cadena; combina con JSON_UNQUOTE para texto plano.
Descripción
JSON_EXTRACT(doc, ruta) sigue el subconjunto de rutas estilo MySQL: $ raíz, . clave, [n] índice. En MySQL 5.7+ / 8 y MariaDB 10.2+ con tipos JSON nativos, permite indexar expresiones generadas sobre rutas frecuentes. El resultado conserva comillas y escapado JSON en cadenas; para comparar con VARCHAR usa JSON_UNQUOTE o el operador ->> en versiones que lo soporten (alias de UNQUOTE(EXTRACT…)). Valida que el documento sea JSON válido: entradas corruptas generan error o NULL según modo. Para agregaciones complejas, JSON_TABLE (MySQL 8) proyecta arrays a filas relacionales.
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.
JSON_EXTRACT(documento_json, ruta)
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.
- Rutas
- $.clave anidada, $[0] array, combinaciones con [*].
- Índices
- Columnas generadas STORED con JSON_UNQUOTE(JSON_EXTRACT(…)) para índices.
- -> y ->>
- Atajos: col->'$.a' equivale a JSON_EXTRACT; ->> añade UNQUOTE.
Ejemplos
Ejemplo 1
SELECT JSON_EXTRACT('{"nombre": "Juan", "edad": 30}', '$.nombre') AS raw;
-- "Juan"
SELECT JSON_EXTRACT(datos, '$.items[0].sku')
FROM pedidos_json
WHERE id = 1;
Ejemplo 2
SELECT id, JSON_EXTRACT(meta, '$.precio') AS precio_json
FROM catalogo
WHERE JSON_EXTRACT(meta, '$.stock') > 0;
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.