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

MariaDB JSON_REPLACE() explicado


No MariaDB, JSON_REPLACE() é uma função interna que substitui valores existentes em um documento JSON e retorna o resultado.

Sintaxe


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

Exemplo


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

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

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

Neste caso eu substituí o valor Cat com Dog .

Elementos da matriz


Para substituir um elemento de matriz, especifique o índice do elemento:
SET @json = '{ "name" : "Wag", "scores" : [8, 0, 9] }';

SELECT JSON_REPLACE(@json, '$.scores[1]', 7);

Resultado:
+---------------------------------------+
| JSON_REPLACE(@json, '$.scores[1]', 7) |
+---------------------------------------+
| {"name": "Wag", "scores": [8, 7, 9]}  |
+---------------------------------------+

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

Vários caminhos


A sintaxe permite substituir valores em vários caminhos com uma única chamada para JSON_REPLACE() .

Ao fornecer vários caminhos, eles são avaliados da esquerda para a direita. Isso significa que o resultado da avaliação anterior é usado como valor para a próxima.

Primeiro, aqui está um exemplo que substitui vários valores em um documento, com base em sua chave:
SET @json = '
    { 
        "name" : "Flutter", 
        "type" : "Bird",
        "weight" : 10
    }
';

SELECT JSON_REPLACE(@json, '$.type', 'Bat', '$.weight', 20);

Resultado:
+------------------------------------------------------+
| JSON_REPLACE(@json, '$.type', 'Bat', '$.weight', 20) |
+------------------------------------------------------+
| {"name": "Flutter", "type": "Bat", "weight": 20}     |
+------------------------------------------------------+

Cada valor foi substituído conforme o esperado.

No próximo exemplo, substituímos vários elementos em uma matriz:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';

SELECT 
    JSON_REPLACE(
        @json, 
        '$.scores[2]', "a", 
        '$.scores[4]', "b"
    ) AS Result;

Resultado:
+------------------------------------+
| Result                             |
+------------------------------------+
| {"scores": [0, 1, "a", 3, "b", 5]} |
+------------------------------------+

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_REPLACE(null, '$.a', 1) AS a,
    JSON_REPLACE('{"a":1}', null, 1) AS b,
    JSON_REPLACE('{"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_REPLACE() . Isso resulta em NULL sendo retornado para ambas as chamadas:
SET @json = '{ "name" : "Wag", "type" : "Cat" }';

SELECT 
    JSON_REPLACE(@json, null, 'Bark', '$.type', 'Dog') AS a,
    JSON_REPLACE(@json, '$.name', 'Bark', null, 'Dog') AS b;

Resultado:
+------+------+
| a    | b    |
+------+------+
| NULL | NULL |
+------+------+

Contagem de parâmetros incorreta


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

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

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

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

Funções semelhantes


O JSON_INSERT() função pode inserir novos dados.

O JSON_SET() função pode inserir novos dados e atualizar dados existentes. Então JSON_SET() é como JSON_INSERT() e JSON_REPLACE() em uma função.