In MariaDB, JSON_REMOVE()
è una funzione integrata che rimuove i dati da un documento JSON e restituisce il risultato.
Sintassi
La sintassi è questa:
JSON_REMOVE(json_doc, path[, path] ...)
Esempio
Ecco un esempio da dimostrare.
SET @json = '{ "name" : "Wag", "type" : "Dog" }';
SELECT JSON_REMOVE(@json, '$.type');
Risultato:
+------------------------------+ | JSON_REMOVE(@json, '$.type') | +------------------------------+ | {"name": "Wag"} | +------------------------------+
In questo caso abbiamo rimosso il membro dati type
dal documento. In altre parole, il type
chiave e il valore associato sono stati rimossi.
Array
JSON_REMOVE()
può essere utilizzato per rimuovere l'intero array o elementi specifici all'interno dell'array.
Per rimuovere l'intero array, usa semplicemente il nome della chiave:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores');
Risultato:
+--------------------------------+ | JSON_REMOVE(@json, '$.scores') | +--------------------------------+ | {"name": "Wag"} | +--------------------------------+
Ciò ha rimosso l'intero array dal documento.
Per rimuovere un elemento dell'array, specificare l'indice dell'elemento. Ecco un esempio di rimozione di un elemento di un array da un array:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores[1]');
Risultato:
+-----------------------------------+ | JSON_REMOVE(@json, '$.scores[1]') | +-----------------------------------+ | {"name": "Wag", "scores": [8, 9]} | +-----------------------------------+
In questo caso, il secondo elemento dell'array è stato rimosso. Gli array sono a base zero, quindi $.scores[1]
fa riferimento al secondo elemento nell'array.
Vedi sotto per come JSON_REMOVE()
si occupa della rimozione di più percorsi all'interno dell'array.
Percorsi multipli
Quando si forniscono più percorsi, vengono valutati da sinistra a destra. Ciò significa che il risultato della valutazione precedente viene utilizzato come valore per la successiva.
Vale la pena prestare particolare attenzione quando si rimuovono elementi da un array in base al loro indice.
Innanzitutto, ecco un esempio che rimuove più percorsi da un documento, in base alla loro chiave:
SET @json = '
{
"name" : "Wag",
"type" : "Dog",
"weight" : 10
}
';
SELECT JSON_REMOVE(@json, '$.type', '$.weight');
Risultato:
+------------------------------------------+ | JSON_REMOVE(@json, '$.type', '$.weight') | +------------------------------------------+ | {"name": "Wag"} | +------------------------------------------+
Ogni coppia chiave/valore è stata rimossa come previsto.
Nel prossimo esempio non rimuoviamo la coppia chiave/valore. Invece, rimuoviamo più elementi da un 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;
Risultato:
+--------------------------+--------------------------+ | a | b | +--------------------------+--------------------------+ | {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} | +--------------------------+--------------------------+
In questo caso abbiamo chiamato JSON_REMOVE()
due volte. Entrambi specificano lo stesso indice di matrice da rimuovere (2
e 4
), ma ci scambiamo gli argomenti nella seconda chiamata. Nel primo esempio, va 2
quindi 4
(in questo ordine). Nel secondo esempio, è 4
quindi 2
.
Ciò ha prodotto un risultato diverso per ogni chiamata. Come accennato, più percorsi vengono valutati da sinistra a destra, quindi l'ordine può influenzare il risultato.
Ecco un altro esempio che illustra come il risultato può essere molto diverso, a seconda di quanti percorsi sono specificati, quali e in quale ordine:
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;
Risultato (usando l'output verticale):
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]}
Argomenti nulli
Se un argomento è NULL
, il risultato è NULL
:
SELECT
JSON_REMOVE(null, '$.a') AS a,
JSON_REMOVE('{"a":1}', null) AS b,
JSON_REMOVE(null, null) AS c;
Risultato:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Conteggio parametri errato
Chiamando JSON_REMOVE()
senza un argomento genera un errore:
SELECT JSON_REMOVE();
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'
È lo stesso quando non vengono passati argomenti sufficienti:
SELECT JSON_REMOVE('{"a":1}');
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'