Ao usar documentos JSON com MySQL, você pode usar o
JSON_ARRAY_APPEND()
função para anexar novos valores a uma matriz. A maneira como funciona é que você fornece o documento JSON como o primeiro argumento e, em seguida, segue com o caminho para anexar, seguido pelo valor a ser anexado.
No MySQL 5.7, esta função era chamada
JSON_APPEND()
mas esse nome não é mais suportado. Sintaxe
A sintaxe fica assim:
JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
Onde:
json_doc
é o documento JSON.path
é o caminho do elemento ao qual anexar o novo valor.val
é o novo valor que será anexado.
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.
Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$', 4) AS 'Result';
Resultado:
+--------------+ | Result | +--------------+ | [1, 2, 3, 4] | +--------------+
Portanto, o terceiro argumento é anexado ao array. Neste caso, eu uso
$
para o caminho. Este é um sinônimo para o documento JSON, portanto, o valor é anexado à matriz de nível superior (que, neste caso, é a única matriz). Exemplo 2 – Matriz aninhada
Aqui está um exemplo de como anexar um valor a um array que está aninhado dentro de outro array.
SELECT JSON_ARRAY_APPEND('[1, 2, [3, 4]]', '$[2]', 5) AS 'Result';
Resultado:
+-------------------+ | Result | +-------------------+ | [1, 2, [3, 4, 5]] | +-------------------+
Então aqui, eu uso
$[2]
como o caminho. Isso especifica a matriz no terceiro elemento (as matrizes usam numeração baseada em zero, portanto, a contagem começa em zero). Se ainda não havia um array naquele elemento, um novo array é criado.
Assim:
SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$[2]', 4) AS 'Result';
Resultado:
+----------------+ | Result | +----------------+ | [1, 2, [3, 4]] | +----------------+
Exemplo 3 – Um documento JSON maior
Este exemplo usa um documento JSON (um pouco) maior. Isso demonstra como o caminho muda dependendo de onde a matriz está no documento.
SET @data = '{ "Person": { "Name": "Homer", "Hobbies": ["Eating", "Sleeping"] } }'; SELECT JSON_ARRAY_APPEND(@data, '$.Person.Hobbies', "Base Jumping") AS 'Result';
Resultado:
+----------------------------------------------------------------------------------+ | Result | +----------------------------------------------------------------------------------+ | {"Person": {"Name": "Homer", "Hobbies": ["Eating", "Sleeping", "Base Jumping"]}} | +----------------------------------------------------------------------------------+
E assim como no exemplo anterior, também podemos criar um novo array aninhado, se necessário:
SET @data = '{ "Person": { "Name": "Homer", "Hobbies": ["Eating", "Sleeping"] } }'; SELECT JSON_ARRAY_APPEND(@data, '$.Person.Hobbies[0]', "Drinking") AS 'Result';
Resultado:
+--------------------------------------------------------------------------------+ | Result | +--------------------------------------------------------------------------------+ | {"Person": {"Name": "Homer", "Hobbies": [["Eating", "Drinking"], "Sleeping"]}} | +--------------------------------------------------------------------------------+