Stocker des données au format JSON est utile, mais il faut aussi pouvoir interroger des champs individuels à l'intérieur. Dans cette étape, vous utiliserez la fonction JSON_EXTRACT et JSON_UNQUOTE pour extraire des valeurs spécifiques de la colonne product_details.
La fonction JSON_EXTRACT vous permet de sélectionner une valeur à partir d'un document JSON en utilisant une expression de chemin (path expression). Le chemin commence par $ pour représenter la racine du document.
Extraisons la brand (marque) de l'ordinateur portable.
SELECT JSON_EXTRACT(product_details, '$.brand') AS brand FROM products WHERE product_name = 'Laptop';
Cette requête renvoie la marque, mais remarquez que le résultat est une chaîne JSON, qui inclut des guillemets doubles.
+--------+
| brand |
+--------+
| "Dell" |
+--------+
1 row in set (0.00 sec)
Pour un résultat plus propre, vous pouvez utiliser JSON_UNQUOTE combiné avec JSON_EXTRACT. Cette combinaison extrait la valeur et supprime les guillemets, renvoyant une chaîne standard.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.brand')) AS brand FROM products WHERE product_name = 'Laptop';
La sortie est maintenant le texte brut Dell.
+-------+
| brand |
+-------+
| Dell |
+-------+
1 row in set (0.00 sec)
Vous pouvez également utiliser des expressions de chemin pour accéder aux valeurs dans des objets imbriqués. Pour obtenir le processor (processeur) de l'objet specs, utilisez le chemin $.specs.processor.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.specs.processor')) AS processor FROM products WHERE product_name = 'Laptop';
Ceci extraira correctement la valeur imbriquée.
+-----------------+
| processor |
+-----------------+
| Intel Core i7 |
+-----------------+
1 row in set (0.00 sec)
Ces fonctions sont également utiles dans les clauses WHERE pour filtrer les lignes. Pour trouver tous les produits dont le prix est supérieur à 1000, vous devez CAST (convertir) la valeur JSON extraite en un type numérique pour la comparaison.
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;
Cette requête démontre comment filtrer des enregistrements basés sur une valeur numérique à l'intérieur d'un champ JSON.
+--------------+-------+
| product_name | price |
+--------------+-------+
| Laptop | 1200 |
+--------------+-------+
1 row in set (0.00 sec)
Vous savez maintenant comment extraire et filtrer des données basées sur des champs JSON.