Dans MariaDB, le JSON_VALUE()
fonction et JSON_QUERY()
font des choses similaires - elles renvoient des données à partir d'un document JSON.
Alors, quelle est la différence ?
La principale différence est que JSON_VALUE()
renvoie des valeurs scalaires, alors que JSON_QUERY()
renvoie des tableaux et des objets.
Définitions
Étant donné un document JSON, chaque fonction effectue les opérations suivantes :
JSON_VALUE()
renvoie le scalaire spécifié par le chemin.JSON_QUERY()
renvoie un objet ou un tableau spécifié par le chemin.
Ma compréhension est que cela fonctionne de cette façon en raison de la norme SQL.
Si cela vous pose des problèmes, vous pouvez trouver le JSON_EXTRACT()
fonction plus utile.
Scalaires
Voici un exemple pour montrer ce qui se passe lorsque nous essayons d'utiliser les deux fonctions pour extraire un scalaire d'un document JSON.
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;
Résultat :
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
a renvoyé le scalaire comme prévu, mais JSON_QUERY()
a renvoyé NULL
. Ceci est attendu, car JSON_QUERY()
ne renvoie que des tableaux et des objets.
C'est le même résultat si nous essayons de renvoyer des données scalaires depuis le tableau :
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;
Résultat :
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objets
Voici ce qui se passe lorsque nous essayons d'utiliser les deux fonctions pour renvoyer un objet entier :
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Résultat :
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Cette fois c'est le JSON_QUERY()
fonction qui réussit.
Tableaux
Voici ce qui se passe lorsque nous essayons d'utiliser les deux fonctions pour renvoyer un tableau entier :
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;
Résultat :
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Encore une fois, le JSON_QUERY()
la fonction réussit.
Cependant, aucune des deux fonctions ne réussit lorsque nous utilisons l'opérateur générique de tableau pour sélectionner tous les éléments scalaires du tableau. Dans ce cas, le JSON_EXTRACT()
vient à la rescousse :
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;
Résultat :
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Cependant, si les éléments du tableau sont des tableaux ou des objets, alors JSON_QUERY()
les renvoie bien :
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;
Résultat :
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+