Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Applies to: SQL Server 2017 (14.x) and later
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
Сцепляет значения строковых выражений, помещая между ними значения-разделители. В конце строки разделитель не добавляется.
Соглашения о синтаксисе Transact-SQL
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Arguments
expression
An expression of any type. Expressions are converted to nvarchar or varchar types during concatenation. Non-string types are converted to nvarchar type.
separator
An expression of nvarchar or varchar type that is used as separator for concatenated strings. Может быть литералом или переменной.
<order_clause>
При необходимости укажите очередность сцепляемых результатов с помощью предложения WITHIN GROUP
:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>
A list of non-constant expressions that can be used for sorting results. В запросе допускается только один аргумент
<order_by_expression_list>
. По умолчанию задан порядок сортировки по возрастанию.
Return types
Тип возвращаемого значения зависит от первого аргумента (выражения). If input argument is string type (nvarchar, varchar), the result type is the same as the input type. В приведенной ниже таблице перечислены автоматические преобразования.
Тип входного выражения | Result |
---|---|
nvarchar(max) | nvarchar(max) |
varchar(max) | varchar(max) |
nvarchar(1..4000) | nvarchar(4000) |
varchar(1..8000) | varchar(8000) |
int, bigint, smallint, tinyint, numeric, float, real, bit, decimal, smallmoney, money, datetime, datetime2 |
nvarchar(4000) |
Remarks
STRING_AGG
— это агрегатная функция, которая принимает все выражения из строк и сцепляет их в одну строку. Значения выражений неявно преобразуются в строковые типы и затем сцепляются. Неявное преобразование в строки выполняется по существующим правилам преобразования типов данных. Дополнительные сведения о преобразованиях типов данных см. в разделе CAST и CONVERT.
If the input expression is type varchar, the separator can't be type nvarchar.
Значения NULL игнорируются, а соответствующий разделитель не добавляется. To return a place holder for null values, use the ISNULL
function as demonstrated in example B.
Функция STRING_AGG
доступна на любом уровне совместимости.
Note
<order_clause>
доступна с уровнем совместимости базы данных 110 и выше.
Examples
Примеры кода в этой статье используют базу данных образца AdventureWorks2022
или AdventureWorksDW2022
, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
A. Формирование списка имен, разделенного по строкам
В приведенном ниже примере формируется список имен в одной результирующей ячейке, разделенный символами возврата каретки.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Вот результирующий набор.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
Значения NULL
, найденные в ячейках name
, не возвращаются в результатах.
Note
Если вы используете редактор запросов SQL Server Management Studio, параметр "Результаты в сетку " не может реализовать возврат каретки. Чтобы результирующий набор отображался правильно, перейдите в режим В виде текста. По умолчанию результаты в виде текста усекаются до 256 символов. Чтобы увеличить это ограничение, измените значение параметра Максимальное число символов, отображаемых в каждом столбце.
B. Создание списка средних имен, разделенных запятыми без значений NULL
В следующем примере значения N/A
заменяются NULL
и возвращаются имена, разделенные запятыми в одной ячейке результатов.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Вот обрезанный результирующий набор.
csv
-----
E,R.,N/A,N/A,B,E,N/A,N/A,N/A,N/A,G,B,N/A,C,J,L,P,N/A,M,N/A,N/A,N/A,L,J., ...
C. Формирование списка значений с разделителями-запятыми
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Вот обрезанный результирующий набор.
names
-------
Ken Sánchez (Feb 8 2003 12:00AM)
Terri Duffy (Feb 24 2002 12:00AM)
Roberto Tamburello (Dec 5 2001 12:00AM)
Rob Walters (Dec 29 2001 12:00AM)
...
Note
Если вы используете редактор запросов SQL Server Management Studio, параметр "Результаты в сетку " не может реализовать возврат каретки. Чтобы результирующий набор отображался правильно, перейдите в режим В виде текста. По умолчанию результаты в виде текста усекаются до 256 символов. Чтобы увеличить это ограничение, измените значение параметра Максимальное число символов, отображаемых в каждом столбце.
D. Получение новых статей со связанными тегами
Представьте базу данных, в которой статьи и их теги разделены по разным таблицам. Разработчику необходимо вернуть одну строку для каждой статьи со всеми связанными тегами. Этот результат имеет следующий запрос:
SELECT a.articleId,
title,
STRING_AGG(tag, ',') AS tags
FROM dbo.Article AS a
LEFT OUTER JOIN dbo.ArticleTag AS t
ON a.ArticleId = t.ArticleId
GROUP BY a.articleId, title;
GO
Вот результирующий набор.
articleId | title | tags |
---|---|---|
172 |
Polls indicate close election results |
politics,polls,city council |
176 |
New highway expected to reduce congestion |
NULL |
177 |
Dogs continue to be more popular than cats |
polls,animals |
Note
Предложение GROUP BY
является обязательным, если функция STRING_AGG
не является единственным элементом в списке SELECT
.
E. Формирование списка адресов электронной почты по городам
Следующий запрос находит адреса электронной почты сотрудников и группирует их по городам:
USE AdventureWorks2022;
GO
SELECT TOP 10 City,
STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') AS emails
FROM Person.BusinessEntityAddress AS BEA
INNER JOIN Person.Address AS A
ON BEA.AddressID = A.AddressID
INNER JOIN Person.EmailAddress AS EA
ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO
Ниже приведен обрезанный результирующий набор.
City | emails |
---|---|
Ballard |
[email protected] ;[email protected] ;[email protected] ; ... |
Baltimore |
[email protected] |
Barstow |
[email protected] |
Basingstoke Hants |
[email protected] ;[email protected] |
Baytown |
[email protected] |
Beaverton |
[email protected] ;[email protected] ;[email protected] ; ... |
Bell Gardens |
[email protected] |
Bellevue |
[email protected] ;[email protected] ;[email protected] ; ... |
Bellflower |
[email protected] ;[email protected] ;[email protected] ; ... |
Bellingham |
[email protected] ;[email protected] ;[email protected] ; ... |
Адреса, возвращенные в столбце emails, можно использовать для рассылки сообщений группе людей, работающих в определенном городе.
F. Формирование отсортированного списка адресов электронной почты по городам
Так же как в предыдущем примере, следующий запрос находит адреса электронной почты сотрудников, группирует их по городам и сортирует по алфавиту:
USE AdventureWorks2022;
GO
SELECT TOP 10 City,
STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') WITHIN GROUP (ORDER BY EmailAddress ASC) AS Emails
FROM Person.BusinessEntityAddress AS BEA
INNER JOIN Person.Address AS A
ON BEA.AddressID = A.AddressID
INNER JOIN Person.EmailAddress AS EA
ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO
Ниже приведен обрезанный результирующий набор.
City | Emails |
---|---|
Barstow |
[email protected] |
Basingstoke Hants |
[email protected] ;[email protected] |
Braintree |
[email protected] |
Bell Gardens |
[email protected] |
Byron |
[email protected] |
Bordeaux |
[email protected] |
Carnation |
[email protected] ;[email protected] ;[email protected] ; ... |
Boulogne-Billancourt |
[email protected] ;[email protected] ;[email protected] ; ... |
Berkshire |
[email protected] ;[email protected] ;[email protected] ; ... |
Berks |
[email protected] ;[email protected] ;[email protected] ; ... |