V MySQL je to JSON_REMOVE()
funkce odstraní data z dokumentu JSON a vrátí výsledek.
Jako první argument zadáte dokument JSON a za ním cestu k odstranění dat. V případě potřeby můžete poskytnout více cest.
Syntaxe
Syntaxe vypadá takto:
JSON_REMOVE(json_doc, cesta[, cesta] ...)
Kde json_doc
je dokument JSON a path
je cesta k odstranění dat.
path
argumenty se vyhodnocují zleva doprava. Dokument vytvořený vyhodnocením jedné cesty se stane novou hodnotou, podle které je vyhodnocena další cesta.
První argument musí být platný dokument JSON, jinak dojde k chybě.
Také path
argument musí být platný výraz cesty a nemůže to být $
nebo obsahuje *
nebo **
zástupný znak, jinak dojde k chybě.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
SELECT JSON_REMOVE('{"a":1, "b":2, "c":3}', '$.b') AS 'Result';
Výsledek:
+-------------------+| Výsledek |+------------------+| {"a":1, "c":3} |+------------------+
V tomto případě jsme odstranili pár klíč/hodnota s klíčem b
. Je to proto, že jsme zadali $.b
jako druhý argument.
Zde je další příklad:
SELECT JSON_REMOVE('{"Jméno":"Homer", "Gender":"Muž", "Věk":39}', '$.Věk') AS 'Výsledek';
Výsledek:
+-------------------------------------+| Výsledek |+-------------------------------------+| {"Jméno":"Homer", "Gender":"Muž"} |+------------------------------- ------+
Příklad 2 – Neexistující cesta
Pokud zadáte cestu, která neexistuje, nic se neodstraní. Původní dokument JSON je vrácen bez úprav.
SELECT JSON_REMOVE('{"Jméno":"Homer", "Věk":39}', '$.Gender') AS 'Výsledek';
Výsledek:
+------------------------------+| Výsledek |+------------------------------+| {"Věk":39, "Jméno":"Homer"} |+------------------------------+Příklad 3 – Pole
Zde je příklad použití pole.
SELECT JSON_REMOVE('[1, 2, 3]', '$[0]') AS 'Result';Výsledek:
+---------+| Výsledek |+--------+| [2, 3] |+--------+Pole používají číslování založené na nule, takže v tomto případě je první prvek z pole odstraněn.
Zde je další příklad pole. Tentokrát odstraníme hodnotu z vnořeného pole.
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]') AS 'Výsledek';Výsledek:
+-----------------+| Výsledek |+-----------------+| [1, 2, [3, 5]] |+-----------------+Příklad 4 – Více cest
Můžete zadat více než jednu cestu k odstranění dat z více míst v dokumentu JSON.
Základní příklad:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[1]', '$[3]') AS 'Výsledek';Výsledek:
+------------+| Výsledek |+------------+| [1, 3, 4] |+------------+Jak již bylo zmíněno,
path
argumenty se vyhodnocují zleva doprava a dokument vytvořený vyhodnocením jedné cesty se stane novou hodnotou, podle níž se vyhodnotí další cesta.Proto v tomto příkladu argument 2. cesta odstraní jinou hodnotu, než jakou by odstranil, kdyby to byl jediný argument cesty. Pokud by to byl jediný argument cesty, odstranil by
4
.Zde je to, co mám na mysli:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[3]') AS 'Jedna cesta', JSON_REMOVE('[1, 2, 3, 4, 5]', ' $[1]', '$[3]') JAKO 'Dvě cesty';Výsledek:
+--------------+-----------+| Jedna cesta | Dvě cesty |+--------------+-----------+| [1, 2, 3, 5] | [1, 3, 4] |+--------------+-----------+Takže to můžete vidět, když použijeme
$[3]
jako jediná cesta odstraní4
z pole. Ale když jej použijeme jako 2. cestu, odstraní5
(a4
je ponecháno nedotčené).Další příklad, tentokrát smazání hodnot z pole a vnořeného pole:
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[0]', '$[1][1]') AS 'Výsledek';Výsledek:
+--------------+| Výsledek |+--------------+| [2, [3, 5]] |+--------------+Takže znovu, i když je pole na pozici
2
v původním dokumentu hodnota první cesty ($[0]
) rozsekne vnější pole a vnitřní pole se změní na pozici1
.Pokud se vám z toho zatočí hlava, můžete vždy zaměnit argumenty cesty tak, aby byly nejprve odstraněny hodnoty nejvíce vpravo. Tímto způsobem to neovlivní polohu hodnot nejvíce vlevo, a proto můžete zadat cesty na základě původního dokumentu JSON.
Můžeme tedy změnit předchozí kód na následující a získat stejný výsledek:
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]', '$[0]') AS 'Výsledek';Výsledek:
+--------------+| Výsledek |+--------------+| [2, [3, 5]] |+--------------+Příklad 5 – Větší dokument JSON
Zde je příklad s (trochu) větším dokumentem JSON.
SET @data ='{ "Osoba":{ "Jméno":"Homer", "Věk":39, "Záliby":["Jídlo", "Spánek", "Base Jumping"] } }'; SELECT JSON_REMOVE(@data, '$.Person.Age', '$.Person.Hobbies[2]') AS 'Výsledek';Výsledek:
+---------------------------------------------- ---------------------+| Výsledek |+----------------------------------------------- --------------------+| {"Osoba":{"Jméno":"Homer", "Hobby":["Jídlo", "Spánek"]}} |+------------------- -----------------------------------------------+