Tema SQL
JSON_UNQUOTE() (MySQL / MariaDB)
Quita comillas y decodifica secuencias de escape de una cadena JSON, produciendo un valor SQL escalar (cadena UTF-8). Paso habitual tras JSON_EXTRACT cuando necesitas comparar con columnas VARCHAR.
Descripción
JSON_UNQUOTE(json_val) convierte "texto" JSON en texto SQL sin comillas. Si el argumento no es una cadena JSON válida, el comportamiento depende del contenido (puede devolver NULL o el valor sin cambio según tipo). En cadenas con unicode escapado \uXXXX, decodifica a caracteres. Combina en expresiones generadas para índices sobre campos JSON concretos. El operador ->> en MySQL es azúcar sintáctico para JSON_UNQUOTE(JSON_EXTRACT(…)). Para números booleanos extraídos, a veces no necesitas UNQUOTE si usas CAST a tipo numérico.
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_UNQUOTE(cadena_json)
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.
- Tras EXTRACT
- Patrón típico: UNQUOTE para obtener Juan sin comillas JSON frente al resultado con comillas de JSON_EXTRACT.
- Comparaciones
- WHERE JSON_UNQUOTE(JSON_EXTRACT(col, ruta_json)) = ? con parámetro enlazado.
- Rendimiento
- Índice en columna generada almacenada mejor que aplicar función en cada fila sin índice.
Ejemplos
Ejemplo 1
SELECT JSON_UNQUOTE(JSON_EXTRACT('{"nombre":"Juan"}', '$.nombre')) AS nombre;
-- Juan
SELECT id
FROM usuarios
WHERE JSON_UNQUOTE(JSON_EXTRACT(preferencias, '$.tema')) = 'oscuro';
Ejemplo 2
SELECT id,
JSON_UNQUOTE(JSON_EXTRACT(perfil, '$.nick')) AS nick
FROM usuarios
WHERE JSON_VALID(perfil);
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.