En MySQL, el JSON_VALUE()
La función extrae un valor de un documento JSON en la ruta especificada.
La función se introdujo en MySQL 8.0.21.
Sintaxis
La sintaxis es así:
JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])
donde:
on_empty:
{NULL | ERROR | DEFAULT value} ON EMPTY
on_error:
{NULL | ERROR | DEFAULT value} ON ERROR
Ejemplo
Aquí hay un ejemplo simple para demostrarlo:
SELECT JSON_VALUE( '{ "name" : "Wag", "type" : "Dog" }', '$.type' );
Resultado:
Dog
Arreglos
Aquí hay un ejemplo de cómo obtener un valor de una matriz:
SELECT JSON_VALUE( '{ "name" : "Wag", "scores" : [ 25, 36, 48 ] }', '$.scores[1]' );
Resultado:
36
Las matrices están basadas en cero, por lo que 1
devuelve el segundo elemento (0
devolvería el primero).
Documentos incrustados
Este es un ejemplo de cómo obtener un valor de un objeto incrustado:
SELECT JSON_VALUE(
'{
"_id" : 1,
"details" : {
"name" : "Wag",
"type" : "Dog"
}
}',
'$.details.type'
);
Resultado:
Dog
Tipo de devolución
Aquí hay un ejemplo de cómo especificar el tipo de retorno:
SELECT JSON_VALUE(
'{
"_id" : 1,
"details" : {
"name" : "Wag",
"type" : "Dog"
}
}',
'$.details' RETURNING json
);
Resultado:
{"name": "Wag", "type": "Dog"}
Si no especifica el tipo de retorno, el tipo de retorno es VARCHAR(512)
.
Resultados vacíos
De forma predeterminada, si no se encuentran datos en la ruta especificada, NULL
se devuelve:
SELECT JSON_VALUE(
'{
"name" : "Wag",
"type" : "Dog"
}',
'$.score'
);
Resultado:
NULL
Sin embargo, las siguientes opciones se pueden usar para especificar explícitamente qué debe suceder cuando no se encuentran datos en la ruta dada:
NULL ON EMPTY
:La función devuelveNULL
; este es el comportamiento predeterminado.DEFAULT
:elvalue
EN VACÍOvalue
proporcionado es regresado. El tipo de valor debe coincidir con el tipo de devolución.ERROR ON EMPTY
:La función arroja un error.
Ejemplo:
SELECT JSON_VALUE(
'{
"name" : "Wag",
"type" : "Dog"
}',
'$.score'
DEFAULT 'Nothing found' ON EMPTY
);
Resultado:
Nothing found
Errores
Se puede usar lo siguiente para especificar qué sucede cuando ocurre un error:
NULL ON ERROR
:JSON_VALUE()
devuelveNULL
; este es el comportamiento predeterminado.DEFAULT
:Este es el valor devuelto; su valor debe coincidir con el del tipo de retorno.value
EN ERRORERROR ON ERROR
:Se lanza un error.
Si se usa, ON EMPTY
debe preceder a cualquier ON ERROR
cláusula. Especificarlos en el orden incorrecto da como resultado un error de sintaxis.
Índices
Como se menciona en las notas de la versión de MySQL 8.0.21, JSON_VALUE()
La función simplifica la creación de índices en JSON
columnas Una llamada a JSON_VALUE(
es equivalente a llamar a json_doc
, path
DEVOLUCIÓN type
)CAST( JSON_UNQUOTE( JSON_EXTRACT(
.json_doc
, path
) ) COMO type
)
Este es el ejemplo utilizado en las notas de la versión:
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)) )
);