I MySQL er JSON_VALUE()
funktion udtrækker en værdi fra et JSON-dokument på den angivne sti.
Funktionen blev introduceret i MySQL 8.0.21.
Syntaks
Syntaksen ser sådan ud:
JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])
Hvor:
on_empty:
{NULL | ERROR | DEFAULT value} ON EMPTY
on_error:
{NULL | ERROR | DEFAULT value} ON ERROR
Eksempel
Her er et simpelt eksempel til at demonstrere:
SELECT JSON_VALUE( '{ "name" : "Wag", "type" : "Dog" }', '$.type' );
Resultat:
Dog
Arrays
Her er et eksempel på at få en værdi fra et array:
SELECT JSON_VALUE( '{ "name" : "Wag", "scores" : [ 25, 36, 48 ] }', '$.scores[1]' );
Resultat:
36
Arrays er nul-baserede, så 1
returnerer det andet element (0
ville returnere den første).
Indlejrede dokumenter
Her er et eksempel på at få en værdi fra et indlejret objekt:
SELECT JSON_VALUE(
'{
"_id" : 1,
"details" : {
"name" : "Wag",
"type" : "Dog"
}
}',
'$.details.type'
);
Resultat:
Dog
Returtype
Her er et eksempel på angivelse af returtypen:
SELECT JSON_VALUE(
'{
"_id" : 1,
"details" : {
"name" : "Wag",
"type" : "Dog"
}
}',
'$.details' RETURNING json
);
Resultat:
{"name": "Wag", "type": "Dog"}
Hvis du ikke angiver returtypen, er returtypen VARCHAR(512)
.
Tomme resultater
Som standard, hvis ingen data findes på den angivne sti, NULL
returneres:
SELECT JSON_VALUE(
'{
"name" : "Wag",
"type" : "Dog"
}',
'$.score'
);
Resultat:
NULL
Følgende muligheder kan dog bruges til eksplicit at angive, hvad der skal ske, når der ikke findes data på den givne sti:
NULL ON EMPTY
:Funktionen returnererNULL
; dette er standardadfærden.DEFAULT
:den angivnevalue
PÅ TOMvalue
er returneret. Værdiens type skal matche returtypens.ERROR ON EMPTY
:Funktionen giver en fejl.
Eksempel:
SELECT JSON_VALUE(
'{
"name" : "Wag",
"type" : "Dog"
}',
'$.score'
DEFAULT 'Nothing found' ON EMPTY
);
Resultat:
Nothing found
Fejl
Følgende kan bruges til at angive, hvad der sker, når der opstår en fejl:
NULL ON ERROR
:JSON_VALUE()
returnererNULL
; dette er standardadfærden.DEFAULT
:Dette er den returnerede værdi; dens værdi skal matche returtypens værdi.value
PÅ FEJLERROR ON ERROR
:Der opstår en fejl.
Hvis brugt, ON EMPTY
skal gå forud for enhver ON ERROR
klausul. Angivelse af dem i den forkerte rækkefølge resulterer i en syntaksfejl.
Indekser
Som nævnt i MySQL 8.0.21 release notes, JSON_VALUE()
funktion forenkler oprettelsen af indekser på JSON
kolonner. Et kald til JSON_VALUE(
svarer til at kalde json_doc
, path
RETURNERER type
)CAST( JSON_UNQUOTE( JSON_EXTRACT(
.json_doc
, path
) ) AS type
)
Her er eksemplet brugt i udgivelsesbemærkningerne:
CREATE TABLE inventory(
items JSON,
INDEX i1 ( (JSON_VALUE(items, '$.name' RETURNING CHAR(50))) ),
INDEX i2 ( (JSON_VALUE(items, '$.price' RETURNING DECIMAL(5,2))) ),
INDEX i3 ( (JSON_VALUE(items, '$.quantity' RETURNING UNSIGNED)) )
);