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.