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