In MariaDB, de JSON_VALUE()
functie en JSON_QUERY()
functie vergelijkbare dingen doen - ze retourneren gegevens uit een JSON-document.
Dus wat is het verschil?
Het belangrijkste verschil is dat JSON_VALUE()
geeft scalaire waarden terug, terwijl JSON_QUERY()
geeft arrays en objecten terug.
Definities
Met een JSON-document doet elke functie het volgende:
JSON_VALUE()
geeft de scalaire waarde terug die door het pad is gespecificeerd.JSON_QUERY()
retourneert een object of array gespecificeerd door het pad.
Ik heb begrepen dat het op deze manier werkt vanwege de SQL-standaard.
Als dit problemen voor u veroorzaakt, vindt u mogelijk de JSON_EXTRACT()
functie nuttiger.
Scalaren
Hier is een voorbeeld om te laten zien wat er gebeurt als we beide functies proberen te gebruiken om een scalair uit een JSON-document te extraheren.
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;
Resultaat:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
heeft de scalaire waarde geretourneerd zoals verwacht, maar JSON_QUERY()
NULL
geretourneerd . Dit wordt verwacht, omdat JSON_QUERY()
retourneert alleen arrays en objecten.
Het is hetzelfde resultaat als we proberen scalaire gegevens uit de array te retourneren:
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;
Resultaat:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objecten
Dit is wat er gebeurt als we beide functies proberen te gebruiken om een heel object te retourneren:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Resultaat:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Deze keer is het de JSON_QUERY()
functie die slaagt.
Arrays
Dit is wat er gebeurt als we beide functies proberen te gebruiken om een hele array te retourneren:
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;
Resultaat:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Nogmaals, de JSON_QUERY()
functie slaagt.
Geen van beide functies slaagt echter wanneer we de array-jokertekenoperator gebruiken om alle scalaire elementen uit de array te selecteren. In dit geval is de JSON_EXTRACT()
komt te hulp:
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;
Resultaat:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Als de elementen van de array echter arrays of objecten zijn, dan JSON_QUERY()
geeft ze goed terug:
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;
Resultaat:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+