sql >> Base de Datos >  >> RDS >> MariaDB

MariaDB JSON_REMOVE() explicado

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'