No MariaDB,
JSON_REMOVE()
é uma função interna que remove dados de um documento JSON e retorna o resultado. Sintaxe
A sintaxe fica assim:
JSON_REMOVE(json_doc, path[, path] ...)
Exemplo
Aqui está um exemplo para demonstrar.
SET @json = '{ "name" : "Wag", "type" : "Dog" }';
SELECT JSON_REMOVE(@json, '$.type');
Resultado:
+------------------------------+ | JSON_REMOVE(@json, '$.type') | +------------------------------+ | {"name": "Wag"} | +------------------------------+
Neste caso, removemos o membro de dados
type
do documento. Em outras palavras, o type
chave e seu valor associado foram removidos. Matrizes
JSON_REMOVE()
pode ser usado para remover todo o array ou elementos específicos dentro do array. Para remover todo o array, basta usar o nome da chave:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores');
Resultado:
+--------------------------------+ | JSON_REMOVE(@json, '$.scores') | +--------------------------------+ | {"name": "Wag"} | +--------------------------------+
Isso removeu toda a matriz do documento.
Para remover um elemento de matriz, especifique o índice do elemento. Aqui está um exemplo de remoção de um elemento de array de um array:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores[1]');
Resultado:
+-----------------------------------+ | JSON_REMOVE(@json, '$.scores[1]') | +-----------------------------------+ | {"name": "Wag", "scores": [8, 9]} | +-----------------------------------+
Nesse caso, o segundo elemento da matriz foi removido. Arrays são baseados em zero, então
$.scores[1]
refere-se ao segundo elemento na matriz. Veja abaixo como
JSON_REMOVE()
lida com a remoção de vários caminhos dentro da matriz. Vários caminhos
Ao fornecer vários caminhos, eles são avaliados da esquerda para a direita. Isso significa que o resultado da avaliação anterior é usado como valor para a próxima.
Vale a pena estar especialmente atento a isso ao remover elementos de uma matriz com base em seu índice.
Primeiro, aqui está um exemplo que remove vários caminhos de um documento, com base em sua chave:
SET @json = '
{
"name" : "Wag",
"type" : "Dog",
"weight" : 10
}
';
SELECT JSON_REMOVE(@json, '$.type', '$.weight');
Resultado:
+------------------------------------------+ | JSON_REMOVE(@json, '$.type', '$.weight') | +------------------------------------------+ | {"name": "Wag"} | +------------------------------------------+
Cada par de chave/valor foi removido conforme o esperado.
No próximo exemplo, não removemos o par chave/valor. Em vez disso, removemos vários elementos de um array:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[2]', '$.scores[4]') AS a,
JSON_REMOVE(@json, '$.scores[4]', '$.scores[2]') AS b;
Resultado:
+--------------------------+--------------------------+ | a | b | +--------------------------+--------------------------+ | {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} | +--------------------------+--------------------------+
Neste caso chamamos
JSON_REMOVE()
duas vezes. Ambos especificam o mesmo índice de array para remover (2
e 4
), mas trocamos os argumentos na segunda chamada. No primeiro exemplo, vai 2
então 4
(naquela ordem). No segundo exemplo, é 4
então 2
. Isso produziu um resultado diferente para cada chamada. Conforme mencionado, vários caminhos são avaliados da esquerda para a direita e, portanto, a ordem pode afetar o resultado.
Aqui está outro exemplo que ilustra como o resultado pode ser bem diferente, dependendo de quantos caminhos são especificados, quais e em qual ordem:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[0]', '$.scores[1]', '$.scores[5]') AS a,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[5]', '$.scores[0]') AS b,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[0]', '$.scores[1]') AS c,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[1]', '$.scores[0]') AS d,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[0]', '$.scores[5]') AS e,
JSON_REMOVE(@json, '$.scores[0]', '$.scores[5]', '$.scores[1]') AS f;
Resultado (usando saída vertical):
a: {"scores": [1, 3, 4, 5]} b: {"scores": [2, 3, 4, 5]} c: {"scores": [1, 3, 4]} d: {"scores": [2, 3, 4]} e: {"scores": [2, 3, 4, 5]} f: {"scores": [1, 3, 4, 5]}
Argumentos nulos
Se algum argumento for
NULL
, o resultado é NULL
:SELECT
JSON_REMOVE(null, '$.a') AS a,
JSON_REMOVE('{"a":1}', null) AS b,
JSON_REMOVE(null, null) AS c;
Resultado:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Contagem de parâmetros incorreta
Chamando
JSON_REMOVE()
sem um argumento resulta em um erro:SELECT JSON_REMOVE();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'
É o mesmo quando não são passados argumentos suficientes:
SELECT JSON_REMOVE('{"a":1}');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'