No MariaDB,
JSON_INSERT()
é uma função interna que insere dados em um documento JSON e retorna o resultado. Sintaxe
A sintaxe fica assim:
JSON_INSERT(json_doc, path, val[, path, val] ...)
Onde
json_doc
é o documento JSON, path
é o caminho para onde os dados devem ser inseridos e val
é o valor a ser inserido nesse caminho. Exemplo
Aqui está um exemplo para demonstrar.
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.type', "Dog");
Resultado:
+----------------------------------------------+ | JSON_INSERT(@json_document, '$.type', "Dog") | +----------------------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------------------+
Aqui eu inseri
"type": "Dog"
no documento. Neste caso, usei
$.type
como o caminho. Portanto, type
é a chave e Dog
é o valor. Quando o caminho já existe
A passagem de um caminho que já existe no documento JSON resulta no retorno do documento original inalterado.
Exemplo:
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark");
Resultado:
+-----------------------------------------------+ | JSON_INSERT(@json_document, '$.name', "Bark") | +-----------------------------------------------+ | {"name": "Wag"} | +-----------------------------------------------+
Inserindo matrizes
Aqui está um exemplo de inserção de uma matriz em um documento JSON:
SET @json_document = '
{
"name" : "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]');
Resultado:
+--------------------------------------------------------+ | JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') | +--------------------------------------------------------+ | {"name": "Wag", "scores": "[ 8, 7, 9 ]"} | +--------------------------------------------------------+
Anexando a matrizes
Aqui está um exemplo de uso de
JSON_INSERT()
para anexar dados a uma matriz:SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog");
Resultado:
+--------------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog") | +--------------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} | +--------------------------------------------------------------+
No entanto, embora tenha funcionado bem para este exemplo, poderia facilmente ter falhado. Por exemplo, se tentarmos inserir o valor em um lugar diferente no array, não funciona:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog");
Resultado:
+-----------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") | +-----------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog"]} | +-----------------------------------------------------------+
Para inserir valores em uma matriz, use o
JSON_ARRAY_INSERT()
função em vez disso. Além disso, embora tenhamos conseguido anexar um valor a uma matriz no exemplo acima, provavelmente é melhor usar o
JSON_ARRAY_APPEND()
função, uma vez que é projetado especificamente para esse fim. Objetos aninhados
Aqui está um exemplo de inserção de um valor em um objeto aninhado dentro de outro objeto:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
);
Resultado:
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"}}}
Embelezar o resultado
Podemos usar o
JSON_DETAILED()
função para tornar o resultado mais fácil de ler:SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
)
);
Resultado:
{ "_id": 1, "name": "Wag", "details": { "type": "Dog", "weight": 20, "awards": { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } } }
Argumentos nulos
Se um dos
json_document
ou path
argumentos são NULL
, o resultado é NULL
:SELECT
JSON_INSERT(null, '$.type', 'Dog'),
JSON_INSERT('{"a":1}', null, 'Dog');
Resultado:
+------------------------------------+-------------------------------------+ | JSON_INSERT(null, '$.type', 'Dog') | JSON_INSERT('{"a":1}', null, 'Dog') | +------------------------------------+-------------------------------------+ | NULL | NULL | +------------------------------------+-------------------------------------+
No entanto, se o
value
argumento é NULL
, a chave é adicionada no caminho especificado, com um valor de null
:SELECT JSON_INSERT('{"a":1}', '$.type', null);
Resultado:
+----------------------------------------+ | JSON_INSERT('{"a":1}', '$.type', null) | +----------------------------------------+ | {"a": 1, "type": null} | +----------------------------------------+
Contagem de parâmetros incorreta
Não fornecer argumentos resulta em um erro:
SELECT JSON_INSERT();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
É o mesmo quando você fornece poucos ou muitos argumentos:
SELECT JSON_INSERT('{ "a": 1}');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Funções semelhantes
O
JSON_REPLACE()
função pode atualizar dados existentes. O
JSON_SET()
função pode atualizar dados existentes e inserir novos dados. Então JSON_SET()
é como JSON_INSERT()
e JSON_REPLACE()
em uma função.