V MariaDB, JSON_REMOVE()
je vestavěná funkce, která odstraňuje data z dokumentu JSON a vrací výsledek.
Syntaxe
Syntaxe vypadá takto:
JSON_REMOVE(json_doc, path[, path] ...)
Příklad
Zde je příklad k demonstraci.
SET @json = '{ "name" : "Wag", "type" : "Dog" }';
SELECT JSON_REMOVE(@json, '$.type');
Výsledek:
+------------------------------+ | JSON_REMOVE(@json, '$.type') | +------------------------------+ | {"name": "Wag"} | +------------------------------+
V tomto případě jsme odstranili datový člen type
z dokumentu. Jinými slovy, type
klíč a jeho přidružená hodnota byly odstraněny.
Pole
JSON_REMOVE()
lze použít k odstranění celého pole nebo určitých prvků v poli.
Chcete-li odstranit celé pole, jednoduše použijte název klíče:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores');
Výsledek:
+--------------------------------+ | JSON_REMOVE(@json, '$.scores') | +--------------------------------+ | {"name": "Wag"} | +--------------------------------+
Tím bylo z dokumentu odstraněno celé pole.
Chcete-li odstranit prvek pole, zadejte index prvku. Zde je příklad odstranění prvku pole z pole:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores[1]');
Výsledek:
+-----------------------------------+ | JSON_REMOVE(@json, '$.scores[1]') | +-----------------------------------+ | {"name": "Wag", "scores": [8, 9]} | +-----------------------------------+
V tomto případě byl odstraněn druhý prvek pole. Pole jsou založeny na nule, takže $.scores[1]
odkazuje na druhý prvek v poli.
Níže se dozvíte, jak JSON_REMOVE()
se zabývá odstraněním více cest v rámci pole.
Více cest
Při poskytování více cest se vyhodnocují zleva doprava. To znamená, že výsledek z dřívějšího vyhodnocení se použije jako hodnota pro další.
Vyplatí se to mít na paměti zejména při odstraňování prvků z pole na základě jejich indexu.
Nejprve je zde příklad, který odstraní více cest z dokumentu na základě jejich klíče:
SET @json = '
{
"name" : "Wag",
"type" : "Dog",
"weight" : 10
}
';
SELECT JSON_REMOVE(@json, '$.type', '$.weight');
Výsledek:
+------------------------------------------+ | JSON_REMOVE(@json, '$.type', '$.weight') | +------------------------------------------+ | {"name": "Wag"} | +------------------------------------------+
Každý pár klíč/hodnota byl podle očekávání odstraněn.
V dalším příkladu neodstraňujeme pár klíč/hodnota. Místo toho z pole odstraníme několik prvků:
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;
Výsledek:
+--------------------------+--------------------------+ | a | b | +--------------------------+--------------------------+ | {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} | +--------------------------+--------------------------+
V tomto případě jsme zavolali JSON_REMOVE()
dvakrát. Oba určují stejný index pole, který se má odstranit (2
a 4
), ale ve druhém volání prohodíme argumenty. V prvním příkladu je to 2
pak 4
(v tomto pořadí). Ve druhém příkladu je to 4
pak 2
.
To přineslo jiný výsledek pro každé volání. Jak již bylo zmíněno, více cest se vyhodnocuje zleva doprava, takže pořadí může ovlivnit výsledek.
Zde je další příklad, který ilustruje, jak může být výsledek zcela odlišný v závislosti na tom, kolik cest je specifikováno, které z nich a v jakém pořadí:
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;
Výsledek (při použití vertikálního výstupu):
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]}
Nulové argumenty
Pokud je některý argument NULL
, výsledkem je NULL
:
SELECT
JSON_REMOVE(null, '$.a') AS a,
JSON_REMOVE('{"a":1}', null) AS b,
JSON_REMOVE(null, null) AS c;
Výsledek:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Nesprávný počet parametrů
Volání JSON_REMOVE()
bez argumentu vede k chybě:
SELECT JSON_REMOVE();
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'
Je to stejné, když není předán dostatek argumentů:
SELECT JSON_REMOVE('{"a":1}');
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'