En MariaDB, JSON_SET()
es una función integrada que actualiza o inserta datos en un documento JSON y devuelve el resultado.
JSON_SET()
puede actualizar e insertar datos, mientras que JSON_INSERT()
solo puede insertar datos y JSON_REPLACE()
solo puede actualizar los datos.
Sintaxis
La sintaxis es así:
JSON_SET(json_doc, path, val[, path, val] ...)
donde:
json_doc
es el documento JSON.path
es la ruta del elemento para el cual insertar datos o actualizar el valor.val
es el nuevo valor.
Ejemplo
Aquí hay un ejemplo para demostrarlo.
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT JSON_SET(@json, '$.type', 'Dog');
Resultado:
+----------------------------------+ | JSON_SET(@json, '$.type', 'Dog') | +----------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------+
En este caso actualicé el valor del type
miembro Cat
a Dog
.
Elementos de matriz
Para actualizar o insertar un elemento de matriz, especifique el índice del elemento:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[1]', 7);
Resultado:
+--------------------------------------+ | JSON_SET(@json, '$.scores[1]', 7) | +--------------------------------------+ | {"name": "Wag", "scores": [8, 7, 9]} | +--------------------------------------+
En este caso, el segundo elemento de la matriz se actualizó con el nuevo valor. Las matrices están basadas en cero, por lo que $.scores[1]
se refiere al segundo elemento de la matriz.
Insertar datos
Los ejemplos anteriores actualizaron los datos existentes. Aquí hay un ejemplo de cómo insertar nuevos datos:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}
';
SELECT JSON_SET(@json, '$.weight', 10);
Resultado:
+----------------------------------------------+ | JSON_SET(@json, '$.weight', 10) | +----------------------------------------------+ | {"name": "Wag", "type": "Dog", "weight": 10} | +----------------------------------------------+
Aquí, insertamos un nuevo par clave/valor ("weight": 10
).
A continuación se muestra un ejemplo de cómo agregar un nuevo elemento a una matriz:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[3]', 7);
Resultado:
+-----------------------------------------+ | JSON_SET(@json, '$.scores[3]', 7) | +-----------------------------------------+ | {"name": "Wag", "scores": [8, 0, 9, 7]} | +-----------------------------------------+
Este ejemplo de matriz también podría hacerse con JSON_ARRAY_INSERT()
o JSON_ARRAY_APPEND()
.
Vías Múltiples
La sintaxis permite configurar/actualizar valores en múltiples rutas con una sola llamada a JSON_SET()
.
Ejemplo:
SET @json = '
{
"name" : "Scratch",
"type" : "Rat"
}
';
SELECT JSON_SET(@json, '$.type', 'Cat', '$.weight', 10);
Resultado:
+--------------------------------------------------+ | JSON_SET(@json, '$.type', 'Cat', '$.weight', 10) | +--------------------------------------------------+ | {"name": "Scratch", "type": "Cat", "weight": 10} | +--------------------------------------------------+
En el siguiente ejemplo, insertamos un nuevo valor en una matriz y actualizamos otro:
SET @json = '{ "scores" : [ 0, 1, 2 ] }';
SELECT
JSON_SET(
@json,
'$.scores[1]', "a",
'$.scores[3]', "b"
) AS Result;
Resultado:
+------------------------------+ | Result | +------------------------------+ | {"scores": [0, "a", 2, "b"]} | +------------------------------+
Argumentos nulos
Si el json_doc
o cualquiera de las path
argumentos es null
, el resultado es NULL
. Pero si el value
el argumento es null
, luego el valor se reemplaza a null
.
SELECT
JSON_SET(null, '$.a', 1) AS a,
JSON_SET('{"a":1}', null, 1) AS b,
JSON_SET('{"a":1}', '$.a', null) AS c;
Resultado:
+------+------+-------------+ | a | b | c | +------+------+-------------+ | NULL | NULL | {"a": null} | +------+------+-------------+
En el siguiente ejemplo, falta uno de los argumentos de ruta de cada llamada a JSON_SET()
. En ambos casos, el resultado es NULL
:
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT
JSON_SET(@json, null, 'Bark', '$.type', 'Dog') AS a,
JSON_SET(@json, '$.name', 'Bark', null, 'Dog') AS b;
Resultado:
+------+------+ | a | b | +------+------+ | NULL | NULL | +------+------+
Recuento de parámetros incorrecto
Llamando a JSON_SET()
sin un argumento da como resultado un error:
SELECT JSON_SET();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'
Es lo mismo cuando no se pasan suficientes argumentos:
SELECT JSON_SET('{"a":1}');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'