MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MariaDB JSON_VALUE() vs. JSON_QUERY():Was ist der Unterschied?

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 } ] |
+------------+------------------------------------+