В MariaDB, JSON_REMOVE()
е вградена функция, която премахва данни от JSON документ и връща резултата.
Синтаксис
Синтаксисът е така:
JSON_REMOVE(json_doc, path[, path] ...)
Пример
Ето пример за демонстрация.
SET @json = '{ "name" : "Wag", "type" : "Dog" }';
SELECT JSON_REMOVE(@json, '$.type');
Резултат:
+------------------------------+ | JSON_REMOVE(@json, '$.type') | +------------------------------+ | {"name": "Wag"} | +------------------------------+
В този случай премахнахме члена на данните type
от документа. С други думи, type
ключът и свързаната с него стойност бяха премахнати.
Масиви
JSON_REMOVE()
може да се използва за премахване на целия масив или конкретни елементи в него.
За да премахнете целия масив, просто използвайте името на ключа:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores');
Резултат:
+--------------------------------+ | JSON_REMOVE(@json, '$.scores') | +--------------------------------+ | {"name": "Wag"} | +--------------------------------+
Това премахна целия масив от документа.
За да премахнете елемент от масив, посочете индекса на елемента. Ето пример за премахване на елемент от масив от масив:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores[1]');
Резултат:
+-----------------------------------+ | JSON_REMOVE(@json, '$.scores[1]') | +-----------------------------------+ | {"name": "Wag", "scores": [8, 9]} | +-----------------------------------+
В този случай вторият елемент от масива е премахнат. Масивите са базирани на нула и така $.scores[1]
се отнася до втория елемент в масива.
Вижте по-долу как JSON_REMOVE()
се занимава с премахването на множество пътища в масива.
Множество пътища
Когато се предоставят множество пътища, те се оценяват отляво надясно. Това означава, че резултатът от по-ранната оценка се използва като стойност за следващата.
Струва си да внимавате особено за това, когато премахвате елементи от масив въз основа на техния индекс.
Първо, ето пример, който премахва множество пътища от документ въз основа на техния ключ:
SET @json = '
{
"name" : "Wag",
"type" : "Dog",
"weight" : 10
}
';
SELECT JSON_REMOVE(@json, '$.type', '$.weight');
Резултат:
+------------------------------------------+ | JSON_REMOVE(@json, '$.type', '$.weight') | +------------------------------------------+ | {"name": "Wag"} | +------------------------------------------+
Всяка двойка ключ/стойност беше премахната според очакванията.
В следващия пример не премахваме двойката ключ/стойност. Вместо това премахваме множество елементи от масив:
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;
Резултат:
+--------------------------+--------------------------+ | a | b | +--------------------------+--------------------------+ | {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} | +--------------------------+--------------------------+
В този случай извикахме JSON_REMOVE()
два пъти. И двете определят един и същ индекс на масива за премахване (2
и 4
), но разменяме аргументите във второто извикване. В първия пример става 2
след това 4
(в този ред). Във втория пример това е 4
след това 2
.
Това доведе до различен резултат за всяко обаждане. Както бе споменато, множество пътища се оценяват отляво надясно и така редът може да повлияе на резултата.
Ето още един пример, който илюстрира как резултатът може да бъде доста различен, в зависимост от това колко пътища са посочени, кои и в кой ред:
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;
Резултат (с помощта на вертикален изход):
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]}
Нулеви аргументи
Ако някой аргумент е NULL
, резултатът е NULL
:
SELECT
JSON_REMOVE(null, '$.a') AS a,
JSON_REMOVE('{"a":1}', null) AS b,
JSON_REMOVE(null, null) AS c;
Резултат:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Неправилен брой параметри
Извикване на JSON_REMOVE()
без аргумент води до грешка:
SELECT JSON_REMOVE();
Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'
Същото е, когато не се предават достатъчно аргументи:
SELECT JSON_REMOVE('{"a":1}');
Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'