En MariaDB, JSON_REMOVE()
es una función integrada que elimina datos de un documento JSON y devuelve el resultado.
Sintaxis
La sintaxis es así:
JSON_REMOVE(json_doc, path[, path] ...)
Ejemplo
Aquí hay un ejemplo para demostrarlo.
SET @json = '{ "name" : "Wag", "type" : "Dog" }';
SELECT JSON_REMOVE(@json, '$.type');
Resultado:
+------------------------------+ | JSON_REMOVE(@json, '$.type') | +------------------------------+ | {"name": "Wag"} | +------------------------------+
En este caso, eliminamos el miembro de datos type
del documento En otras palabras, el type
Se eliminaron la clave y su valor asociado.
Arreglos
JSON_REMOVE()
se puede usar para eliminar toda la matriz o elementos específicos dentro de la matriz.
Para eliminar toda la matriz, simplemente use el nombre de la clave:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores');
Resultado:
+--------------------------------+ | JSON_REMOVE(@json, '$.scores') | +--------------------------------+ | {"name": "Wag"} | +--------------------------------+
Eso eliminó toda la matriz del documento.
Para eliminar un elemento de matriz, especifique el índice del elemento. Aquí hay un ejemplo de cómo eliminar un elemento de matriz de una matriz:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores[1]');
Resultado:
+-----------------------------------+ | JSON_REMOVE(@json, '$.scores[1]') | +-----------------------------------+ | {"name": "Wag", "scores": [8, 9]} | +-----------------------------------+
En este caso, se eliminó el segundo elemento de la matriz. Las matrices están basadas en cero, por lo que $.scores[1]
se refiere al segundo elemento de la matriz.
Vea a continuación cómo JSON_REMOVE()
se ocupa de eliminar varias rutas dentro de la matriz.
Vías Múltiples
Cuando se proporcionan varias rutas, se evalúan de izquierda a derecha. Esto significa que el resultado de la evaluación anterior se utiliza como valor para la siguiente.
Vale la pena tener esto especialmente en cuenta al eliminar elementos de una matriz en función de su índice.
Primero, aquí hay un ejemplo que elimina varias rutas de un documento, según su clave:
SET @json = '
{
"name" : "Wag",
"type" : "Dog",
"weight" : 10
}
';
SELECT JSON_REMOVE(@json, '$.type', '$.weight');
Resultado:
+------------------------------------------+ | JSON_REMOVE(@json, '$.type', '$.weight') | +------------------------------------------+ | {"name": "Wag"} | +------------------------------------------+
Cada par clave/valor se eliminó como se esperaba.
En el siguiente ejemplo, no eliminamos el par clave/valor. En su lugar, eliminamos varios elementos de una matriz:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[2]', '$.scores[4]') AS a,
JSON_REMOVE(@json, '$.scores[4]', '$.scores[2]') AS b;
Resultado:
+--------------------------+--------------------------+ | a | b | +--------------------------+--------------------------+ | {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} | +--------------------------+--------------------------+
En este caso llamamos a JSON_REMOVE()
dos veces. Ambos especifican el mismo índice de matriz para eliminar (2
y 4
), pero intercambiamos los argumentos en la segunda llamada. En el primer ejemplo, va 2
entonces 4
(en ese orden). En el segundo ejemplo, es 4
entonces 2
.
Esto produjo un resultado diferente para cada llamada. Como se mencionó, las rutas múltiples se evalúan de izquierda a derecha, por lo que el orden puede afectar el resultado.
Aquí hay otro ejemplo que ilustra cómo el resultado puede ser bastante diferente, dependiendo de cuántas rutas se especifiquen, cuáles y en qué orden:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[0]', '$.scores[1]', '$.scores[5]') AS a,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[5]', '$.scores[0]') AS b,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[0]', '$.scores[1]') AS c,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[1]', '$.scores[0]') AS d,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[0]', '$.scores[5]') AS e,
JSON_REMOVE(@json, '$.scores[0]', '$.scores[5]', '$.scores[1]') AS f;
Resultado (usando salida vertical):
a: {"scores": [1, 3, 4, 5]} b: {"scores": [2, 3, 4, 5]} c: {"scores": [1, 3, 4]} d: {"scores": [2, 3, 4]} e: {"scores": [2, 3, 4, 5]} f: {"scores": [1, 3, 4, 5]}
Argumentos nulos
Si algún argumento es NULL
, el resultado es NULL
:
SELECT
JSON_REMOVE(null, '$.a') AS a,
JSON_REMOVE('{"a":1}', null) AS b,
JSON_REMOVE(null, null) AS c;
Resultado:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Recuento de parámetros incorrecto
Llamando a JSON_REMOVE()
sin un argumento da como resultado un error:
SELECT JSON_REMOVE();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'
Es lo mismo cuando no se pasan suficientes argumentos:
SELECT JSON_REMOVE('{"a":1}');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'