В MariaDB, JSON_ARRAYAGG()
е вградена функция, която връща JSON масив, съдържащ елемент за всяка стойност в даден набор от JSON или SQL стойности.
Функцията действа върху колона или израз, който се оценява до една стойност. Той ви позволява да агрегирате набор от резултати като един JSON масив. Всеки ред от резултатния набор завършва като единичен елемент в масива.
Синтаксис
Синтаксисът е така:
JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
Пример
Да предположим, че правим заявка за таблица:
SELECT PetName
FROM Pets;
И вземете следния набор от резултати:
+--------+| Име на домашни любимци |+---------+| Пухкави || Извличане || Надраскване || Размахване || Tweet || Пухкави || Кора || Мяу |+--------+
Резултатът е една колона и всеки ред съдържа различно име на домашен любимец.
Да кажем, че искаме всички домашни любимци да бъдат изброени в JSON масив (така че всяко име на домашен любимец да е свой собствен елемент от масива).
Можем да използваме JSON_ARRAYAGG()
функция, за да направи точно това:
SELECT JSON_ARRAYAGG(PetName)
FROM Pets;
Резултат:
+------------------------------------------------------- ---------------------+| JSON_ARRAYAGG(име на домашни любимци) |+-------------------------------------------- -----------------------+| ["Fluffy","Fetch","Scratch","Wag","Tweet","Fluffy","Bark","Meow"] |+--------------- -------------------------------------------------- --+
Всичко, което направихме, беше да предадем името на колоната на JSON_ARRAYAGG()
функция.
Отличи резултати
Можем да добавим DISTINCT
клауза за премахване на дублиращи се стойности от масива:
SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets;
Резултат:
+------------------------------------------------------- ------------+| JSON_ARRAYAGG(DISTINCT PetName) |+------------------------------------------- ---------------+| ["Лая","Извличане","Пухкаво","Мяу","Скреч","Туит","Размахване"] |+------------------- ---------------------------------------+
Забележете, че Fluffy
беше включен само веднъж тук, докато Fluffy
беше включен два пъти в предишния пример (тъй като има два домашни любимци, наречени Fluffy
).
Поръчайте резултатите
Можем да използваме ORDER BY
клауза за определяне на реда за елементите на масива:
SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets;
Резултат:
+------------------------------------------------------- ---------------------+| JSON_ARRAYAGG(Име на домашни любимци ПОРЪЧАЙТЕ ПО DESC) |+---------------------------------------- ---------------------------+| ["Wag","Tweet","Scratch","Meow","Fluffy","Fluffy","Fetch","Bark"] |+--------------- -------------------------------------------------- --+
Ограничете резултатите
Можем да използваме LIMIT
клауза за определяне на реда за елементите на масива:
SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets;
Резултат:
+--------------------------------+| JSON_ARRAYAGG(ОГРАНИЧЕНИЕ на името на любимеца 3) |+--------------------------------+| ["Fluffy","Fetch","Scratch"] |+--------------------------------+предварително>Можем също да използваме отместване за
LIMIT
клауза:SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) FROM Pets;
Резултат:
+-----------------------------------+| JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) |+---------------------------------------- -+| ["Scratch","Wag","Tweet"] |+----------------------------------- ------+Като алтернатива можем да пропуснем
LIMIT
иOFFSET
ключови думи и сменете числата (и ги разделете със запетая), за да постигнете същия резултат:SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3) FROM Pets;
Резултат:
+---------------------------------+| JSON_ARRAYAGG(PetName LIMIT 2, 3) |+----------------------------------+| ["Scratch","Wag","Tweet"] |+----------------------------------- +Групирани резултати
Можем да използваме SQL
GROUP BY
клауза за създаване на масиви въз основа на групиране на друга колона.Да предположим, че добавяме колона към нашата оригинална заявка:
SELECT PetTypeId, PetName FROM Pets;
Резултат:
+-----------+--------+| PetTypeId | Име на домашни любимци |+----------+--------+| 2 | Пухкави || 3 | Извличане || 2 | Надраскване || 3 | Размахване || 1 | Tweet || 3 | Пухкави || 3 | Кора || 2 | Мяу |+-----------+--------+Сега имаме
PetTypeId
колона, както иPetName
колона. Това съответства на тип домашен любимец за всяко име.Ето пример за използване на
GROUP BY
клауза за групиране на нашите резултати поPetTypeId
колона, докато използватеJSON_ARRAYAGG()
функция:SELECT PetTypeId, JSON_ARRAYAGG(PetName) FROM Pets GROUP BY PetTypeId;
Резултат:
+-----------+--------------------------------+ | PetTypeId | JSON_ARRAYAGG(име на домашни любимци) |+----------+-------------------------------- -+| 1 | ["Туит"] || 2 | ["Fluffy","Scratch","Meow"] || 3 | ["Извличане","Wag","Fluffy","Bark"] |+-----------+------------------- --------------+Това ни позволи да създадем отделен масив за всеки тип домашен любимец.
Следната заявка използва
INNER JOIN
на друга таблица, за да върнете действителния тип домашен любимец, а не само ID.SELECT pt.PetType, p.PetName FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId ORDER BY PetType;
Резултат:
+--------+--------+| PetType | Име на домашни любимци |+---------+--------+| Птица | Tweet || Котка | Надраскване || Котка | Пухкави || Котка | Мяу || Куче | Размахване || Куче | Извличане || Куче | Кора || Куче | Пухкав |+---------+--------+Можем да видим, че всеки тип домашен любимец е посочен в първата колона, а името на домашния любимец е посочено във втората колона.
Сега нека използваме
JSON_ARRAYAGG()
функция:SELECT pt.PetType, JSON_ARRAYAGG(p.PetName) FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId GROUP BY pt.PetType;
Резултат:
+--------+--------------------------+| PetType | JSON_ARRAYAGG(p.PetName) |+---------+--------------------------+| Птица | Tweet || Котка | Драскане, пухкаво, мяу || Куче | Размахване, качване, лаене, пухкаво |+---------+--------------------------+