Almacenar datos en formato JSON es útil, pero también necesita poder consultar campos individuales dentro de él. En este paso, utilizará la función JSON_EXTRACT y JSON_UNQUOTE para extraer valores específicos de la columna product_details.
La función JSON_EXTRACT le permite seleccionar un valor de un documento JSON utilizando una expresión de ruta. La ruta comienza con $ para representar la raíz del documento.
Extraigamos la brand (marca) de la laptop.
SELECT JSON_EXTRACT(product_details, '$.brand') AS brand FROM products WHERE product_name = 'Laptop';
Esta consulta devuelve la marca, pero observe que el resultado es una cadena JSON, que incluye comillas dobles.
+--------+
| brand |
+--------+
| "Dell" |
+--------+
1 row in set (0.00 sec)
Para obtener un resultado más limpio, puede usar JSON_UNQUOTE combinado con JSON_EXTRACT. Esta combinación extrae el valor y elimina las comillas, devolviendo una cadena estándar.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.brand')) AS brand FROM products WHERE product_name = 'Laptop';
La salida ahora es el texto plano Dell.
+-------+
| brand |
+-------+
| Dell |
+-------+
1 row in set (0.00 sec)
También puede usar expresiones de ruta para acceder a valores en objetos anidados. Para obtener el processor (procesador) del objeto specs, use la ruta $.specs.processor.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.specs.processor')) AS processor FROM products WHERE product_name = 'Laptop';
Esto extraerá correctamente el valor anidado.
+-----------------+
| processor |
+-----------------+
| Intel Core i7 |
+-----------------+
1 row in set (0.00 sec)
Estas funciones también son útiles en las cláusulas WHERE para filtrar filas. Para encontrar todos los productos con un precio superior a 1000, debe CAST (convertir) el valor JSON extraído a un tipo numérico para la comparación.
SELECT product_name, JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS price FROM products WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED) > 1000;
Esta consulta demuestra cómo filtrar registros basándose en un valor numérico dentro de un campo JSON.
+--------------+-------+
| product_name | price |
+--------------+-------+
| Laptop | 1200 |
+--------------+-------+
1 row in set (0.00 sec)
Ahora sabe cómo extraer y filtrar datos basándose en campos JSON.