No MySQL, o
JSON_SET()
A função insere ou atualiza valores em um documento JSON e retorna o resultado. Você fornece o documento JSON como o primeiro argumento, seguido pelo caminho a ser inserido, seguido pelo valor a ser inserido. Você pode fornecer vários pares de caminho/valor se precisar atualizar vários valores.
Sintaxe
A sintaxe fica assim:
JSON_SET(json_doc, caminho, val[, caminho, 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.
Os pares caminho-valor são avaliados da esquerda para a direita. O documento produzido pela avaliação de um par se torna o novo valor em relação ao qual o próximo par é avaliado.
Ocorre um erro se o primeiro argumento não for um documento JSON válido ou se algum argumento de caminho não for uma expressão de caminho válida ou contiver um
*
ou **
curinga. Exemplo 1 – Inserir um valor
Aqui está um exemplo para demonstrar como inserir um valor usando esta função.
SELECT JSON_SET('{"a":1, "b":2}', '$.c', 3) AS 'Result';
Resultado:
+--------------------------+| Resultado |+--------------------------+| {"a":1, "b":2, "c":3} |+--------------------------+
Neste caso, o 3º argumento é inserido no array no caminho especificado. Eu uso$.c
para o caminho e3
para que o valor seja inserido. Isso resulta em um par chave/valor de"c": 3
.
Aqui está outro exemplo:
SELECT JSON_SET('{"Name":"Homer", "Gender":"Masculino"}', '$.Idade', 39) AS 'Result';
Resultado:
+---------------------------------------------- --+| Resultado |+---------------------------------------------------------- -+| {"Idade":39, "Nome":"Homer", "Gênero":"Masculino"} |+------------------------- -----------------------+Exemplo 2 – Atualizar um valor
O exemplo anterior inseriu um valor. Este exemplo atualiza um valor existente.
SELECT JSON_SET('{"a":1, "b":2}', '$.b', 3) AS 'Result';
Resultado:
+------------------+| Resultado |+------------------+| {"a":1, "b":3} |+------------------+
Aqui está outro exemplo:
SELECT JSON_SET('{"Name":"Homer", "Gender":"Masculino"}', '$.Name', "Bart") AS 'Result';
Resultado:
+------------------------------------+| Resultado |+------------------------------------+| {"Nome":"Bart", "Gênero":"Masculino"} |+------------------------------------------ -----+Exemplo 3 – Matrizes
Você pode inserir valores em uma matriz usando um caminho após o final da matriz existente. Exemplo:
SELECT JSON_SET('[1, 2, 3]', '$[3]', 4) AS 'Resultado';
Resultado:
+--------------+| Resultado |+----------+| [1, 2, 3, 4] |+-----------------+
No entanto, se você usar um caminho que já existe no array, o valor será atualizado:
SELECT JSON_SET('[1, 2, 3]', '$[1]', 4) AS 'Resultado';
Resultado:
+-----------+| Resultado |+-----------+| [1, 4, 3] |+-----------+
Se o valor existente não for uma matriz, ele será encapsulado automaticamente como uma matriz e estendido com o novo valor. Exemplo:
SELECT JSON_SET('{"a":1, "b":2}', '$[2]', 3) AS 'Resultado';
Resultado:
+-----------------------+| Resultado |+-----------------------+| [{"a":1, "b":2}, 3] |+-----------------------+Exemplo 4 – Vários valores
Você pode inserir/atualizar vários valores de uma só vez. Basta adicionar cada par de chave/valor separado por uma vírgula. Exemplo:
SELECT JSON_SET('{"a":1, "b":2, "c":3}', '$.a', 9, '$.c', 'Bart') AS 'Result';
Resultado:
+-------------------------------+| Resultado |+------------------------------------------+| {"a":9, "b":2, "c":"Bart"} |+------------------------------------------ ----+Exemplo 5 – Um documento JSON maior
Aqui está um exemplo com um documento JSON (um pouco) maior.
SET @data ='{ "Pessoa":{ "Nome":"Homer", "Hobbies":["Comer", "Dormir"] } }';SELECT JSON_SET(@data, '$.Pessoa. Name', 'Bart', '$.Person.Hobbies[1]', "Mischief") AS 'Result';
Resultado:
+---------------------------------------------- -------------------+| Resultado |+---------------------------------------------------------- ------------------+| {"Pessoa":{"Nome":"Bart", "Hobbies":["Comer", "Travessuras"]}} |+-------------------- ----------------------------------------------+
Veja tambémJSON_INSERT()
para inserir valores sem substituir valores existentes eJSON_REPLACE()
para substituir apenas os valores existentes.