In MariaDB der JSON_VALUE()
Funktion und JSON_QUERY()
-Funktion machen ähnliche Dinge – sie geben Daten aus einem JSON-Dokument zurück.
Was ist also der Unterschied?
Der Hauptunterschied besteht darin, dass JSON_VALUE()
gibt skalare Werte zurück, während JSON_QUERY()
gibt Arrays und Objekte zurück.
Definitionen
Bei einem JSON-Dokument führt jede Funktion Folgendes aus:
JSON_VALUE()
gibt den durch den Pfad angegebenen Skalar zurück.JSON_QUERY()
gibt ein durch den Pfad angegebenes Objekt oder Array zurück.
Mein Verständnis ist, dass es aufgrund des SQL-Standards so funktioniert.
Wenn Ihnen dies Probleme bereitet, finden Sie möglicherweise den JSON_EXTRACT()
Funktion nützlicher.
Skalare
Hier ist ein Beispiel, um zu demonstrieren, was passiert, wenn wir versuchen, beide Funktionen zu verwenden, um einen Skalar aus einem JSON-Dokument zu extrahieren.
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;
Ergebnis:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
gab den Skalar wie erwartet zurück, aber JSON_QUERY()
gab NULL
zurück . Dies wird erwartet, da JSON_QUERY()
gibt nur Arrays und Objekte zurück.
Es ist das gleiche Ergebnis, wenn wir versuchen, skalare Daten aus dem Array zurückzugeben:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;
Ergebnis:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objekte
Folgendes passiert, wenn wir versuchen, beide Funktionen zu verwenden, um ein ganzes Objekt zurückzugeben:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Ergebnis:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Diesmal ist es JSON_QUERY()
Funktion, die erfolgreich ist.
Arrays
Folgendes passiert, wenn wir versuchen, beide Funktionen zu verwenden, um ein ganzes Array zurückzugeben:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;
Ergebnis:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Wieder die JSON_QUERY()
Funktion erfolgreich.
Keine der beiden Funktionen ist jedoch erfolgreich, wenn wir den Array-Wildcard-Operator verwenden, um alle skalaren Elemente aus dem Array auszuwählen. In diesem Fall der JSON_EXTRACT()
kommt zur Rettung:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;
Ergebnis:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Wenn die Elemente des Arrays jedoch Arrays oder Objekte sind, dann JSON_QUERY()
gibt sie gut zurück:
SET @json_document = '
{
"name" : "Rufus",
"scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ]
}
';
SELECT
JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;
Ergebnis:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+