No MySQL, o
JSON_REMOVE()
A função remove dados de um documento JSON e retorna o resultado. Você fornece o documento JSON como o primeiro argumento, seguido pelo caminho do qual remover os dados. Você pode fornecer vários caminhos, se necessário.
Sintaxe
A sintaxe fica assim:
JSON_REMOVE(json_doc, caminho[, caminho] ...)
Onde
json_doc
é o documento JSON e path
é o caminho para remover os dados. O
path
argumentos são avaliados da esquerda para a direita. O documento produzido pela avaliação de um caminho se torna o novo valor em relação ao qual o próximo caminho é avaliado. O primeiro argumento deve ser um documento JSON válido, caso contrário, ocorrerá um erro.
Além disso, o
path
argumento deve ser uma expressão de caminho válida e não pode ser $
ou contém um *
ou **
curinga, caso contrário ocorrerá um erro. Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
SELECT JSON_REMOVE('{"a":1, "b":2, "c":3}', '$.b') AS 'Result';
Resultado:
+------------------+| Resultado |+------------------+| {"a":1, "c":3} |+------------------+
Neste caso, removemos o par chave/valor com a chave de
b
. Isso ocorre porque especificamos $.b
como segundo argumento. Aqui está outro exemplo:
SELECT JSON_REMOVE('{"Name":"Homer", "Gender":"Masculino", "Idade":39}', '$.Idade') AS 'Result';
Resultado:
+-------------------------------------+| Resultado |+-------------------------------------+| {"Nome":"Homer", "Sexo":"Masculino"} |+------------------------------------------ ------+
Exemplo 2 – Caminho inexistente
Se você especificar um caminho que não existe, nada será removido. O documento JSON original é retornado sem modificação.
SELECT JSON_REMOVE('{"Nome":"Homer", "Idade":39}', '$.Gender') AS 'Result';
Resultado:
+------------------------------+| Resultado |+-----------------------------------------+| {"Idade":39, "Nome":"Homer"} |+------------------------------+Exemplo 3 – Matrizes
Aqui está um exemplo usando uma matriz.
SELECT JSON_REMOVE('[1, 2, 3]', '$[0]') AS 'Resultado';
Resultado:
+--------+| Resultado |+--------+| [2, 3] |+--------+
As matrizes usam numeração baseada em zero, portanto, nesse caso, o primeiro elemento é removido da matriz.
Aqui está outro exemplo de matriz. Desta vez, removemos um valor de um array aninhado.
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]') AS 'Resultado';
Resultado:
+----------------+| Resultado |+----------------+| [1, 2, [3, 5]] |+----------------+Exemplo 4 – Vários caminhos
Você pode especificar mais de um caminho para remover dados de vários locais no documento JSON.
Exemplo básico:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[1]', '$[3]') AS 'Resultado';
Resultado:
+-----------+| Resultado |+-----------+| [1, 3, 4] |+-----------+
Como mencionado, opath
os argumentos são avaliados da esquerda para a direita e o documento produzido pela avaliação de um caminho se torna o novo valor em relação ao qual o próximo caminho é avaliado.
Portanto, neste exemplo, o argumento 2nd path remove um valor diferente do que teria removido se fosse o único argumento path. Se fosse o único argumento de caminho, teria removido4
.
Aqui está o que quero dizer:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[3]') AS 'One Path', JSON_REMOVE('[1, 2, 3, 4, 5]', ' $[1]', '$[3]') AS 'Dois Caminhos';
Resultado:
+--------------+-----------+| Um Caminho | Dois Caminhos |+--------------+-----------+| [1, 2, 3, 5] | [1, 3, 4] |+--------------+-----------+
Então você pode ver que quando usamos$[3]
como o único caminho, ele remove4
da matriz. Mas quando o usamos como 2º caminho, ele remove5
(e4
fica intacto).
Outro exemplo, desta vez excluindo valores de uma matriz e uma matriz aninhada:
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[0]', '$[1][1]') AS 'Resultado';
Resultado:
+-------------+| Resultado |+-------------+| [2, [3, 5]] |+-------------+
Então, novamente, mesmo que o array esteja na posição2
no documento original, o primeiro valor do caminho ($[0]
) corta o array externo e o array interno muda para a posição1
.
Se isso faz sua cabeça girar, você sempre pode trocar os argumentos de caminho, para que os valores mais à direita sejam removidos primeiro. Dessa forma, não afetará a posição dos valores mais à esquerda e, portanto, você poderá especificar os caminhos com base no documento JSON original.
Assim, podemos alterar o código anterior para o seguinte e obter o mesmo resultado:
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]', '$[0]') AS 'Resultado';
Resultado:
+-------------+| Resultado |+-------------+| [2, [3, 5]] |+-------------+Exemplo 5 – Um documento JSON maior
Aqui está um exemplo com um documento JSON (um pouco) maior.
SET @data ='{ "Pessoa":{ "Nome":"Homer", "Idade":39, "Hobbies":["Comer", "Dormir", "Base Jumping"] } }'; SELECT JSON_REMOVE(@data, '$.Person.Age', '$.Person.Hobbies[2]') AS 'Result';
Resultado:
+---------------------------------------------- --------------------+| Resultado |+---------------------------------------------------------- -------------------+| {"Pessoa":{"Nome":"Homer", "Hobbies":["Comer", "Dormir"]}} |+------------------- -----------------------------------------------+