В MariaDB, JSON_INSERT() е вградена функция, която вмъква данни в JSON документ и връща резултата.
Синтаксис
Синтаксисът е така:
JSON_INSERT(json_doc, path, val[, path, val] ...)
Където json_doc е JSON документът, path е пътят, където трябва да се вмъкнат данните, и val е стойността, която трябва да се вмъкне в този път.
Пример
Ето пример за демонстрация.
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.type', "Dog"); Резултат:
+----------------------------------------------+
| JSON_INSERT(@json_document, '$.type', "Dog") |
+----------------------------------------------+
| {"name": "Wag", "type": "Dog"} |
+----------------------------------------------+
Тук вмъкнах "type": "Dog" в документа.
В този случай използвах $.type като пътеката. Следователно, type е ключът и Dog е стойността.
Когато пътят вече съществува
Предаването на път, който вече съществува в документа JSON, води до връщане на оригиналния документ непроменен.
Пример:
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark"); Резултат:
+-----------------------------------------------+
| JSON_INSERT(@json_document, '$.name', "Bark") |
+-----------------------------------------------+
| {"name": "Wag"} |
+-----------------------------------------------+ Вмъкване на масиви
Ето пример за вмъкване на масив в JSON документ:
SET @json_document = '
{
"name" : "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]'); Резултат:
+--------------------------------------------------------+
| JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') |
+--------------------------------------------------------+
| {"name": "Wag", "scores": "[ 8, 7, 9 ]"} |
+--------------------------------------------------------+ Добавяне към масиви
Ето пример за използване на JSON_INSERT() за добавяне на данни към масив:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog"); Резултат:
+--------------------------------------------------------------+
| JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog") |
+--------------------------------------------------------------+
| {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} |
+--------------------------------------------------------------+ Въпреки това, въпреки че работи добре за този пример, лесно можеше да се провали. Например, ако се опитаме да вмъкнем стойността на различно място в масива, тя не работи:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog"); Резултат:
+-----------------------------------------------------------+
| JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") |
+-----------------------------------------------------------+
| {"_id": 1, "awards": ["Top Dog", "Best Dog"]} |
+-----------------------------------------------------------+
За да вмъкнете стойности в масив, използвайте JSON_ARRAY_INSERT() функция вместо това.
Освен това, въпреки че успяхме да добавим стойност към масив в горния пример, вероятно е по-добре да използвате JSON_ARRAY_APPEND() функция, тъй като е проектирана специално за тази цел.
Вложени обекти
Ето пример за вмъкване на стойност в обект, вложен в друг обект:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
); Резултат:
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"}}} Украсете резултата
Можем да използваме JSON_DETAILED() функция, за да направи резултата по-лесен за четене:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
)
); Резултат:
{
"_id": 1,
"name": "Wag",
"details":
{
"type": "Dog",
"weight": 20,
"awards":
{
"Florida Dog Awards": "Top Dog",
"New York Marathon": "Fastest Dog",
"Sumo 2020": "Biggest Dog"
}
}
} Нулеви аргументи
Ако някой от json_document или path аргументите са NULL , резултатът е NULL :
SELECT
JSON_INSERT(null, '$.type', 'Dog'),
JSON_INSERT('{"a":1}', null, 'Dog'); Резултат:
+------------------------------------+-------------------------------------+
| JSON_INSERT(null, '$.type', 'Dog') | JSON_INSERT('{"a":1}', null, 'Dog') |
+------------------------------------+-------------------------------------+
| NULL | NULL |
+------------------------------------+-------------------------------------+
Ако обаче value аргументът е NULL , ключът се добавя на посочения път със стойност null :
SELECT JSON_INSERT('{"a":1}', '$.type', null); Резултат:
+----------------------------------------+
| JSON_INSERT('{"a":1}', '$.type', null) |
+----------------------------------------+
| {"a": 1, "type": null} |
+----------------------------------------+ Неправилен брой параметри
Предоставянето на без аргументи води до грешка:
SELECT JSON_INSERT(); Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Същото е, когато предоставите твърде малко или твърде много аргументи:
SELECT JSON_INSERT('{ "a": 1}'); Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Подобни функции
JSON_REPLACE() функция може да актуализира съществуващите данни.
JSON_SET() функцията може да актуализира съществуващи данни и да вмъква нови данни. Така че JSON_SET() е като JSON_INSERT() и JSON_REPLACE() в една функция.