In MariaDB, il JSON_VALUE()
funzione e JSON_QUERY()
funzione fanno cose simili:restituiscono dati da un documento JSON.
Allora qual è la differenza?
La differenza principale è che JSON_VALUE()
restituisce valori scalari, mentre JSON_QUERY()
restituisce array e oggetti.
Definizioni
Dato un documento JSON, ogni funzione esegue le seguenti operazioni:
JSON_VALUE()
restituisce lo scalare specificato dal percorso.JSON_QUERY()
restituisce un oggetto o un array specificato dal percorso.
La mia comprensione è che funziona in questo modo a causa dello standard SQL.
Se questo ti causa problemi, potresti trovare il JSON_EXTRACT()
funzione più utile.
Scalari
Ecco un esempio per dimostrare cosa succede quando si tenta di utilizzare entrambe le funzioni per estrarre uno scalare da un documento 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;
Risultato:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
ha restituito lo scalare come previsto, ma JSON_QUERY()
restituito NULL
. Questo è previsto, perché JSON_QUERY()
restituisce solo matrici e oggetti.
È lo stesso risultato se proviamo a restituire dati scalari dall'array:
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;
Risultato:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Oggetti
Ecco cosa succede quando tentiamo di utilizzare entrambe le funzioni per restituire un intero oggetto:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Risultato:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Questa volta è il JSON_QUERY()
funzione che riesce.
Array
Ecco cosa succede quando tentiamo di utilizzare entrambe le funzioni per restituire un intero 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;
Risultato:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Di nuovo, il JSON_QUERY()
la funzione riesce.
Tuttavia, nessuna delle due funzioni riesce quando utilizziamo l'operatore jolly dell'array per selezionare tutti gli elementi scalari dall'array. In questo caso, il JSON_EXTRACT()
viene in soccorso:
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;
Risultato:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Tuttavia, se gli elementi dell'array sono array o oggetti, allora JSON_QUERY()
li restituisce benissimo:
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;
Risultato:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+