Повечето от основните RDBMS имат функция, която ни позволява да върнем резултатите от заявката си като списък, разделен със запетая.
Тоест, можем да използваме такава функция, за да преобразуваме всеки ред в отделен елемент от списък, в рамките на разделен със запетая списък.
По-долу са дадени примери за това как да постигнете това в някои от по-популярните RDBMS.
MySQL
MySQL има GROUP_CONCAT()
функция, която ни позволява да изведем резултатите от нашата заявка в разделен със запетая списък:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Резултат:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Можем също да правим неща като премахване на дублиращи се стойности (с DISTINCT
клауза), посочете ред за резултатите (с ORDER BY
клауза) и посочете различен разделител.
Вижте GROUP_CONCAT()
Функция в MySQL за повече примери.
База данни на Oracle
Oracle Database има LISTAGG()
функция:
SELECT LISTAGG(last_name, ', ')
FROM employees
WHERE job_id = 'IT_PROG';
Резултат:
Hunold, Ernst, Austin, Pataballa, Lorentz
Подобно на MySQL, Oracle Database също ни позволява да премахнем дублиращи се стойности, да посочим ред за резултатите, да посочим различен разделител и т.н.
Вижте LISTAGG()
Функция в Oracle за още примери.
SQL сървър
SQL Server има STRING_AGG()
функция, за да върне нашите резултати в списък, разделен със запетая:
SELECT STRING_AGG(Genre, ',') AS Result FROM Genres
Резултат:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Можем също да премахнем дублиращи се стойности, да посочим ред за резултатите, да променим разделителя и т.н.
Вижте как да върнете резултатите от заявката като списък, разделен със запетая, в SQL Server за повече примери.
MariaDB
Подобно на MySQL, MariaDB също има GROUP_CONCAT()
функция:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Резултат:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Подобно на едноименната функция на MySQL, ние също можем да правим неща като премахване на дублиращи се стойности (с DISTINCT
клауза), посочете ред за резултатите (с ORDER BY
клауза), променете разделителя и т.н.
Въпреки това, едно нещо, което MariaDB има над MySQL, е LIMIT
клауза, която ни предоставя възможността да ограничим броя на резултатите в списъка.
Вижте MariaDB GROUP_CONCAT()
за още примери.
PostgreSQL
Postgres има STRING_AGG()
функция:
SELECT STRING_AGG(PetName, ',')
FROM Pets;
Резултат:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Можем също да премахнем дублиращи се стойности (с DISTINCT
клауза), посочете ред за резултатите (с ORDER BY
клауза), променете разделителя и т.н.
Вижте STRING_AGG()
Функция в PostgreSQL за повече примери.
SQLite
В SQLite можем да използваме GROUP_CONCAT()
функция за трансформиране на резултатите от нашата заявка в списък, разделен със запетая:
SELECT group_concat(FirstName)
FROM Employee;
Резултат:
Andrew,Nancy,Jane,Margaret,Steve,Michael,Robert,Laura
Вижте как GROUP_CONCAT()
Работи в SQLite за повече примери.
Множество колони
Всички горни примери използват една колона за списъка. Можем също да обединим множество колони, за да създадем списък, който включва множество колони.
Да предположим, че имаме таблица със следните данни:
SELECT TaskId, TaskName
FROM Tasks;
Резултат:
TaskId TaskName ------ ------------ 1 Feed cats 2 Water dog 3 Feed garden 4 Paint carpet 5 Clean roof 6 Feed cats
В SQL Server можем да направим следното, за да изведем двете колони в един ред:
SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ')
FROM Tasks
Резултат:
1) Feed cats 2) Water dog 3) Feed garden 4) Paint carpet 5) Clean roof 6) Feed cats