Das Speichern von Daten in JSON ist nützlich, aber Sie müssen auch in der Lage sein, einzelne Felder darin abzufragen. In diesem Schritt verwenden Sie die Funktion JSON_EXTRACT und JSON_UNQUOTE, um spezifische Werte aus der Spalte product_details abzurufen.
Die Funktion JSON_EXTRACT ermöglicht es Ihnen, einen Wert aus einem JSON-Dokument mithilfe eines Pfadausdrucks auszuwählen. Der Pfad beginnt mit $ zur Darstellung des Dokumenten-Roots.
Lassen Sie uns die Marke (brand) des Laptops extrahieren.
SELECT JSON_EXTRACT(product_details, '$.brand') AS brand FROM products WHERE product_name = 'Laptop';
Diese Abfrage gibt die Marke zurück, aber beachten Sie, dass das Ergebnis ein JSON-String ist, der Anführungszeichen enthält.
+--------+
| brand |
+--------+
| "Dell" |
+--------+
1 row in set (0.00 sec)
Für ein saubereres Ergebnis können Sie JSON_UNQUOTE in Kombination mit JSON_EXTRACT verwenden. Diese Kombination extrahiert den Wert und entfernt die Anführungszeichen, wodurch ein Standard-String zurückgegeben wird.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.brand')) AS brand FROM products WHERE product_name = 'Laptop';
Die Ausgabe ist nun der reine Text Dell.
+-------+
| brand |
+-------+
| Dell |
+-------+
1 row in set (0.00 sec)
Sie können Pfadausdrücke auch verwenden, um auf Werte in verschachtelten Objekten zuzugreifen. Um den Prozessor (processor) aus dem Objekt specs zu erhalten, verwenden Sie den Pfad $.specs.processor.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.specs.processor')) AS processor FROM products WHERE product_name = 'Laptop';
Dies extrahiert den verschachtelten Wert korrekt.
+-----------------+
| processor |
+-----------------+
| Intel Core i7 |
+-----------------+
1 row in set (0.00 sec)
Diese Funktionen sind auch in WHERE-Klauseln zum Filtern von Zeilen nützlich. Um alle Produkte mit einem Preis über 1000 zu finden, müssen Sie den extrahierten JSON-Wert für den Vergleich in einen numerischen Typ CASTen.
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;
Diese Abfrage zeigt, wie Datensätze basierend auf einem numerischen Wert innerhalb eines JSON-Feldes gefiltert werden.
+--------------+-------+
| product_name | price |
+--------------+-------+
| Laptop | 1200 |
+--------------+-------+
1 row in set (0.00 sec)
Sie wissen nun, wie Sie Daten basierend auf JSON-Feldern extrahieren und filtern.