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'