I MariaDB er JSON_VALUE()
funktion og JSON_QUERY()
funktion gør lignende ting - de returnerer data fra et JSON-dokument.
Så hvad er forskellen?
Den største forskel er, at JSON_VALUE()
returnerer skalære værdier, hvorimod JSON_QUERY()
returnerer arrays og objekter.
Definitioner
Givet et JSON-dokument gør hver funktion følgende:
JSON_VALUE()
returnerer den skalar, der er angivet af stien.JSON_QUERY()
returnerer et objekt eller et array angivet af stien.
Min forståelse er, at det fungerer på denne måde på grund af SQL-standarden.
Hvis dette forårsager problemer for dig, kan du muligvis finde JSON_EXTRACT()
funktion mere nyttig.
Skalarer
Her er et eksempel for at demonstrere, hvad der sker, når vi forsøger at bruge begge funktioner til at udtrække en skalar fra et JSON-dokument.
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;
Resultat:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
returnerede skalaren som forventet, men JSON_QUERY()
returnerede NULL
. Dette forventes, fordi JSON_QUERY()
returnerer kun arrays og objekter.
Det er det samme resultat, hvis vi forsøger at returnere skalardata fra arrayet:
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;
Resultat:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objekter
Her er, hvad der sker, når vi forsøger at bruge begge funktioner til at returnere et helt objekt:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Resultat:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Denne gang er det JSON_QUERY()
funktion, der lykkes.
Arrays
Her er, hvad der sker, når vi forsøger at bruge begge funktioner til at returnere et helt array:
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;
Resultat:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Igen, JSON_QUERY()
funktionen lykkes.
Ingen af funktionerne lykkes dog, når vi bruger array-jokertegnoperatoren til at vælge alle skalære elementer fra arrayet. I dette tilfælde er JSON_EXTRACT()
kommer til undsætning:
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;
Resultat:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Men hvis arrayets elementer er arrays eller objekter, så JSON_QUERY()
returnerer dem fint:
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;
Resultat:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+