En MySQL, JSON_REMOVE()
La función elimina datos de un documento JSON y devuelve el resultado.
Proporciona el documento JSON como primer argumento, seguido de la ruta de la que se eliminarán los datos. Puede proporcionar varias rutas si es necesario.
Sintaxis
La sintaxis es así:
JSON_REMOVE(json_doc, path[, path] ...)
Donde json_doc
es el documento JSON y path
es la ruta para eliminar datos.
La path
los argumentos se evalúan de izquierda a derecha. El documento producido al evaluar una ruta se convierte en el nuevo valor contra el cual se evalúa la siguiente ruta.
El primer argumento debe ser un documento JSON válido; de lo contrario, se producirá un error.
Además, la path
el argumento debe ser una expresión de ruta válida y no puede ser $
o contiene un *
o **
comodín, de lo contrario se producirá un error.
Ejemplo 1:uso básico
Aquí hay un ejemplo para demostrarlo.
SELECT JSON_REMOVE('{"a": 1, "b": 2, "c": 3}', '$.b') AS 'Result';
Resultado:
+------------------+ | Result | +------------------+ | {"a": 1, "c": 3} | +------------------+
En este caso, eliminamos el par clave/valor con la clave de b
. Esto se debe a que especificamos $.b
como segundo argumento.
Aquí hay otro ejemplo:
SELECT JSON_REMOVE('{"Name": "Homer", "Gender": "Male", "Age": 39}', '$.Age') AS 'Result';
Resultado:
+-------------------------------------+ | Result | +-------------------------------------+ | {"Name": "Homer", "Gender": "Male"} | +-------------------------------------+
Ejemplo 2:ruta inexistente
Si especifica una ruta que no existe, no se elimina nada. El documento JSON original se devuelve sin modificaciones.
SELECT JSON_REMOVE('{"Name": "Homer", "Age": 39}', '$.Gender') AS 'Result';
Resultado:
+------------------------------+ | Result | +------------------------------+ | {"Age": 39, "Name": "Homer"} | +------------------------------+
Ejemplo 3:matrices
Aquí hay un ejemplo usando una matriz.
SELECT JSON_REMOVE('[1, 2, 3]', '$[0]') AS 'Result';
Resultado:
+--------+ | Result | +--------+ | [2, 3] | +--------+
Las matrices usan numeración basada en cero, por lo que en este caso, el primer elemento se elimina de la matriz.
Aquí hay otro ejemplo de matriz. Esta vez eliminamos un valor de una matriz anidada.
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]') AS 'Result';
Resultado:
+----------------+ | Result | +----------------+ | [1, 2, [3, 5]] | +----------------+
Ejemplo 4:rutas múltiples
Puede especificar más de una ruta para eliminar datos de varios lugares en el documento JSON.
Ejemplo básico:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[1]', '$[3]') AS 'Result';
Resultado:
+-----------+ | Result | +-----------+ | [1, 3, 4] | +-----------+
Como se mencionó, la path
los argumentos se evalúan de izquierda a derecha y el documento producido al evaluar una ruta se convierte en el nuevo valor contra el cual se evalúa la siguiente ruta.
Por lo tanto, en este ejemplo, el argumento de la segunda ruta elimina un valor diferente al que habría eliminado si hubiera sido el único argumento de la ruta. Si hubiera sido el único argumento de ruta, habría eliminado 4
.
Esto es lo que quiero decir:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[3]') AS 'One Path', JSON_REMOVE('[1, 2, 3, 4, 5]', '$[1]', '$[3]') AS 'Two Paths';
Resultado:
+--------------+-----------+ | One Path | Two Paths | +--------------+-----------+ | [1, 2, 3, 5] | [1, 3, 4] | +--------------+-----------+
Entonces puedes ver que cuando usamos $[3]
como única ruta, elimina 4
de la matriz. Pero cuando lo usamos como la segunda ruta, elimina 5
(y 4
se deja intacto).
Otro ejemplo, esta vez eliminando valores de una matriz y una matriz anidada:
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[0]', '$[1][1]') AS 'Result';
Resultado:
+-------------+ | Result | +-------------+ | [2, [3, 5]] | +-------------+
De nuevo, aunque la matriz está en la posición 2
en el documento original, el primer valor de ruta ($[0]
) corta la matriz externa hacia abajo y la matriz interna cambia a la posición 1
.
Si esto le da vueltas a la cabeza, siempre puede cambiar los argumentos de la ruta, de modo que los valores más a la derecha se eliminen primero. De esa forma, no afectará la posición de los valores más a la izquierda y, por lo tanto, puede especificar las rutas en función del documento JSON original.
Así que podemos cambiar el código anterior por el siguiente y obtener el mismo resultado:
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]', '$[0]') AS 'Result';
Resultado:
+-------------+ | Result | +-------------+ | [2, [3, 5]] | +-------------+
Ejemplo 5:un documento JSON más grande
Aquí hay un ejemplo con un documento JSON (ligeramente) más grande.
SET @data = '{ "Person": { "Name": "Homer", "Age": 39, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }'; SELECT JSON_REMOVE(@data, '$.Person.Age', '$.Person.Hobbies[2]') AS 'Result';
Resultado:
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Person": {"Name": "Homer", "Hobbies": ["Eating", "Sleeping"]}} | +------------------------------------------------------------------+