MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

MariaDB JSON_SET() Explicado


No MariaDB, JSON_SET() é uma função interna que atualiza ou insere dados em um documento JSON e retorna o resultado.

JSON_SET() pode atualizar e inserir dados, enquanto JSON_INSERT() só pode inserir dados e JSON_REPLACE() só pode atualizar dados.

Sintaxe


A sintaxe fica assim:
JSON_SET(json_doc, path, val[, path, val] ...)

Onde:
  • json_doc é o documento JSON.
  • path é o caminho do elemento para o qual inserir dados ou atualizar o valor.
  • val é o novo valor.

Exemplo


Aqui está um exemplo para demonstrar.
SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Cat" 
    }
';

SELECT JSON_SET(@json, '$.type', 'Dog');

Resultado:
+----------------------------------+
| JSON_SET(@json, '$.type', 'Dog') |
+----------------------------------+
| {"name": "Wag", "type": "Dog"}   |
+----------------------------------+

Neste caso atualizei o valor do type membro Cat para Dog .

Elementos da matriz


Para atualizar ou inserir um elemento de array, especifique o índice do 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]} |
+--------------------------------------+

Nesse caso, o segundo elemento do array foi atualizado com o novo valor. Arrays são baseados em zero, então $.scores[1] refere-se ao segundo elemento na matriz.

Inserir dados


Os exemplos anteriores atualizaram os dados existentes. Aqui está um exemplo de inserção de novos dados:
SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Dog" 
    }
';

SELECT JSON_SET(@json, '$.weight', 10);

Resultado:
+----------------------------------------------+
| JSON_SET(@json, '$.weight', 10)              |
+----------------------------------------------+
| {"name": "Wag", "type": "Dog", "weight": 10} |
+----------------------------------------------+

Aqui, inserimos um novo par chave/valor ("weight": 10 ).

Abaixo está um exemplo de adição de um novo elemento a um array:
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 exemplo de array também pode ser feito com JSON_ARRAY_INSERT() ou JSON_ARRAY_APPEND() .

Vários caminhos


A sintaxe permite definir/atualizar valores em vários caminhos com uma única chamada para JSON_SET() .

Exemplo:
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} |
+--------------------------------------------------+

No próximo exemplo, inserimos um novo valor em um array e atualizamos outro:
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


Se o json_doc ou qualquer um dos path argumentos é null , o resultado é NULL . Mas se o value argumento é null , o valor será substituído por 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} |
+------+------+-------------+

No exemplo a seguir, um dos argumentos de caminho está faltando em cada chamada para JSON_SET() . Em ambos os casos, o resultado é 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 |
+------+------+

Contagem de parâmetros incorreta


Chamando JSON_SET() sem um argumento resulta em um erro:
SELECT JSON_SET();

Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'

É o mesmo quando não são passados ​​argumentos suficientes:
SELECT JSON_SET('{"a":1}');

Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'