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

MariaDB JSON_SET() explicado

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'