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