Когато използвате JSON документи с MySQL, можете да използвате JSON_ARRAY_APPEND() функция за добавяне на нови стойности към масив.
Начинът, по който работи, е, че предоставяте документа JSON като първи аргумент, след което го проследявате с пътя, към който да добавите, последван от стойността за добавяне.
В MySQL 5.7 тази функция беше наречена JSON_APPEND() но това име вече не се поддържа.
Синтаксис
Синтаксисът е така:
JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
Къде:
json_docе JSON документът.pathе пътят на елемента, към който да се добави новата стойност.valе новата стойност, която ще бъде добавена.
Двойките път-стойност се оценяват отляво надясно. Документът, създаден чрез оценка на една двойка, става новата стойност, спрямо която се оценява следващата двойка.
Пример 1 – Основна употреба
Ето пример за демонстрация.
SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$', 4) AS 'Result';
Резултат:
+--------------+ | Result | +--------------+ | [1, 2, 3, 4] | +--------------+
Така че третият аргумент се добавя към масива. В този случай използвам $ за пътеката. Това е синоним на документа JSON, така че стойността се добавя към масива от най-високо ниво (който в този случай се оказва единственият масив).
Пример 2 – Вложен масив
Ето пример за добавяне на стойност към масив, който е вложен в друг масив.
SELECT JSON_ARRAY_APPEND('[1, 2, [3, 4]]', '$[2]', 5) AS 'Result';
Резултат:
+-------------------+ | Result | +-------------------+ | [1, 2, [3, 4, 5]] | +-------------------+
Така че тук използвам $[2] като пътеката. Това определя масива при третия елемент (масивите използват номериране на базата на нула, така че броят започва от нула).
Ако все още не е имало масив в този елемент, се създава нов масив.
Като това:
SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$[2]', 4) AS 'Result';
Резултат:
+----------------+ | Result | +----------------+ | [1, 2, [3, 4]] | +----------------+
Пример 3 – По-голям JSON документ
Този пример използва (малко) по-голям JSON документ. Това показва как пътят се променя в зависимост от това къде се намира масивът в документа.
SET @data = '{
"Person": {
"Name": "Homer",
"Hobbies": ["Eating", "Sleeping"]
}
}';
SELECT JSON_ARRAY_APPEND(@data, '$.Person.Hobbies', "Base Jumping") AS 'Result';
Резултат:
+----------------------------------------------------------------------------------+
| Result |
+----------------------------------------------------------------------------------+
| {"Person": {"Name": "Homer", "Hobbies": ["Eating", "Sleeping", "Base Jumping"]}} |
+----------------------------------------------------------------------------------+
И точно както в предишния пример, можем също да създадем нов, вложен масив, ако е необходимо:
SET @data = '{
"Person": {
"Name": "Homer",
"Hobbies": ["Eating", "Sleeping"]
}
}';
SELECT JSON_ARRAY_APPEND(@data, '$.Person.Hobbies[0]', "Drinking") AS 'Result';
Резултат:
+--------------------------------------------------------------------------------+
| Result |
+--------------------------------------------------------------------------------+
| {"Person": {"Name": "Homer", "Hobbies": [["Eating", "Drinking"], "Sleeping"]}} |
+--------------------------------------------------------------------------------+