Когато използвате 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"]}} | +--------------------------------------------------------------------------------+