loading..
Русский    English
21:06
листать

Функция STRING_AGG стр. 2

На предыдущей странице для SQL Server решалась задача вывода отсортированного списка кораблей каждой страны. Приведем здесь примеры решения этой задачи, для некоторых других популярных СУБД.

MySQL

Как уже упоминалось, в MySQL для этой цели служит функция GROUP_CONCAT:

  1. SELECT country, GROUP_CONCAT(name ORDER BY name) ships_list
  2.     FROM Ships s JOIN Classes c ON s.class=c.class
  3.     GROUP BY country
  4.     ORDER BY country;

Результаты:

country    ships_list
Gt.Britain    Ramillies,Renown,Repulse,Resolution,Revenge,Royal Oak,Royal Sovereign
Japan    Haruna,Hiei,Kirishima,Kongo,Musashi,Yamato
USA    California,Iowa,Missouri,New Jersey,North Carolina,South Dakota,Tennessee,Washington,Wisconsin

Как видно по результатам, разделителем списка по умолчанию является запятая. Однако вы можете указать в качестве разделителя любую последовательность символов (а также пустую строку) с помощью необязательного предложения SEPARATOR. В примере ниже используется трехсимвольный разделитель " | ".

  1. SELECT country, GROUP_CONCAT(name ORDER BY name SEPARATOR ' | ') ships_list
  2.     FROM Ships s JOIN Classes c ON s.class=c.class
  3.     GROUP BY country
  4.     ORDER BY country;

country    ships_list
Gt.Britain    ramillies | renown | repulse | resolution | revenge | royal oak | royal sovereign
Japan    haruna | hiei | kirishima | kon | musashi | yamato
USA    california | iowa | missouri | new jersey | north carolina | south dakota | tennessee | washington | wisconsin

PostgreSQL

В PostgreSQL также имеется функция STRING_AGG. Следующее ранее приведенное решение для SQL Server будет работать в PostgreSQL:

  1. SELECT country, STRING_AGG(name, ',') ships_list
  2. FROM Ships s JOIN Classes c ON s.class=c.class
  3. GROUP BY country
  4. ORDER BY country;

Однако для вывода отсортированного списка здесь используется необязательное предложение ORDER BY во втором аргументе функции:

  1. SELECT country, STRING_AGG(name, ',' ORDER BY name) ships_list
  2. FROM Ships s JOIN Classes c ON s.class=c.class
  3. GROUP BY country
  4. ORDER BY country;

Для тех версий PostgreSQL, которые не поддерживают функцию STRING_AGG, эту задачу можно решить следующим образом:

  1. SELECT country, ARRAY_TO_STRING(ARRAY_AGG(name ORDER BY name),',') ships_list
  2.     FROM Ships s JOIN Classes c ON s.class=c.class
  3.     GROUP BY country
  4.     ORDER BY country;

Здесь функция ARRAY_AGG формирует массив из имен кораблей, упорядочив их по возрастанию. Функция ARRAY_TO_STRING преобразует массив в строку, используя в нашем случае запятую в качестве разделителя элементов массива. Как и для MySQL, в качестве разделителя мы можем использовать любую строку символов. Но здесь разделитель является обязательным элементом, т.е. значения по умолчанию нет.

Oracle

Для Oracle решение похоже на решение для SQL Server, только функция агрегации называется LISTAGG, а не STRING_AGG:

  1. SELECT country, LISTAGG(name,',') WITHIN GROUP (ORDER BY name) ships_list
  2.     FROM Ships s JOIN Classes c ON s.class=c.class
  3.     GROUP BY country
  4.     ORDER BY country;

Есть и другие синтаксические отличия. Так, разделитель в LISTAGG, в отличие от STRING_AGG, является необязательным параметром. Если его опустить, выполняется конкатенация строк, т.е. по умолчанию разделителем является пустая строка (''). Зато предложение WITHIN в Oracle является обязательным.

"Есть многое на свете, друг Горацио...".


Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
Нюансы конструкции гидравлического домкрата . https://garant-pr.ru/system/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.