In MariaDB, JSON_EXTRACT()
è una funzione integrata che estrae i dati da un documento JSON, in base a un determinato percorso.
Può restituire valori singoli e valori multipli. Se viene trovato un valore singolo, viene restituito un valore singolo. Se vengono confrontati più valori, tali valori vengono restituiti in una matrice.
Sintassi
La sintassi è questa:
JSON_EXTRACT(json_doc, path[, path] ...)
Dove json_doc
è il documento JSON e ogni path
argomento è un percorso all'interno del documento.
Esempio
Ecco un esempio da dimostrare.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Risultato:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Percorsi multipli
Ecco un esempio di specificazione di più percorsi per restituire più valori dal documento JSON.
Quando restituisci più valori, questi vengono restituiti in una matrice.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
Risultato:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
Percorsi inesistenti
Il passaggio di un percorso che non esiste nel documento JSON restituisce NULL
.
Esempio:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Risultato:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Tuttavia, se vengono passati più percorsi e almeno uno di essi corrisponde, il valore corrispondente viene estratto e restituito in una matrice. Questo è vero anche se viene estratto un solo valore.
Esempio:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Risultato:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Array
Ecco un esempio di estrazione di dati da un array:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
Risultato:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
Gli array sono a base zero, quindi $.awards[0]
estrae il primo elemento dei awards
matrice.
Oggetti nidificati
Ecco un esempio di estrazione di dati da un oggetto annidato all'interno di un altro oggetto:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards.New York Marathon'
) AS Result;
Risultato:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
Tuttavia, se volessimo estrarre tutti i premi, potremmo abbreviare il percorso a $.details.awards
:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards'
) AS Result;
Risultato:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
Abbellire il risultato
Possiamo semplificare la lettura del risultato passando JSON_EXTRACT()
al JSON_DETAILED()
funzione:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_EXTRACT(
@json_document,
'$.details.awards'
)
) AS Result;
Risultato:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
Argomenti nulli
Se un argomento è NULL
, il risultato è NULL
:
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Risultato:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Conteggio parametri errato
Non fornire argomenti genera un errore:
SELECT JSON_EXTRACT();
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
È lo stesso quando fornisci troppi pochi o troppi argomenti:
SELECT JSON_EXTRACT('{ "a": 1}');
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'