STRING_AGG (Transact-SQL)STRING_AGG (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Сцепляет значения строковых выражений, помещая между ними значения-разделители.Concatenates the values of string expressions and places separator values between them. В конце строки разделитель не добавляется.The separator is not added at the end of string.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

STRING_AGG ( expression, separator ) [ <order_clause> ]

<order_clause> ::=   
    WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )   

АргументыArguments

expressionexpression
Выражение любого типа данных.Is an expression of any type. Во время объединения выражения преобразуются в тип NVARCHAR или VARCHAR.Expressions are converted to NVARCHAR or VARCHAR types during concatenation. Нестроковые типы преобразуются в тип NVARCHAR.Non-string types are converted to NVARCHAR type.

separatorseparator
Выражение типа NVARCHAR или VARCHAR, которое используется в качестве разделителя сцепляемых строк.Is an expression of NVARCHAR or VARCHAR type that is used as separator for concatenated strings. Может быть литералом или переменной.It can be literal or variable.

<order_clause><order_clause>
При необходимости укажите очередность сцепляемых результатов с помощью предложения WITHIN GROUP:Optionally specify order of concatenated results using WITHIN GROUP clause:

WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

<order_by_expression_list><order_by_expression_list>

Список неконстантных выражений, который можно использовать для сортировки результатов.A list of non-constant expressions that can be used for sorting results. В запросе допускается только один аргумент order_by_expression.Only one order_by_expression is allowed per query. По умолчанию задан порядок сортировки по возрастанию.The default sort order is ascending.

Типы возвращаемых данныхReturn Types

Тип возвращаемого значения зависит от первого аргумента (expression).Return type is depends on first argument (expression). Если входной аргумент имеет строковый тип (NVARCHAR, VARCHAR), результат будет иметь тот же тип.If input argument is string type (NVARCHAR, VARCHAR), result type will be same as input type. В приведенной ниже таблице перечислены автоматические преобразования.The following table lists automatic conversions:

Тип входного выраженияInput expression type РезультатResult
NVARCHAR(MAX)NVARCHAR(MAX) NVARCHAR(MAX)NVARCHAR(MAX)
VARCHAR(MAX)VARCHAR(MAX) VARCHAR(MAX)VARCHAR(MAX)
NVARCHAR(1...4000)NVARCHAR(1...4000) NVARCHAR(4000)NVARCHAR(4000)
VARCHAR(1...8000)VARCHAR(1...8000) VARCHAR(8000)VARCHAR(8000)
int, bigint, smallint, tinyint, numeric, float, real, bit, decimal, smallmoney, money, datetime, datetime2,int, bigint, smallint, tinyint, numeric, float, real, bit, decimal, smallmoney, money, datetime, datetime2, NVARCHAR(4000)NVARCHAR(4000)

RemarksRemarks

STRING_AGG — это агрегатная функция, которая принимает все выражения из строк и сцепляет их в одну строку.STRING_AGG is an aggregate function that takes all expressions from rows and concatenates them into a single string. Значения выражений неявно преобразуются в строковые типы и затем сцепляются.Expression values are implicitly converted to string types and then concatenated. Неявное преобразование в строки выполняется по существующим правилам преобразования типов данных.The implicit conversion to strings follows the existing rules for data type conversions. Дополнительные сведения о преобразовании типов данных см. в статье Функции CAST и CONVERT (Transact-SQL).For more information about data type conversions, see CAST and CONVERT (Transact-SQL).

Если входное выражение имеет тип VARCHAR, разделитель не может иметь тип NVARCHAR.If the input expression is type VARCHAR, the separator cannot be type NVARCHAR.

Значения NULL пропускаются, и соответствующий разделитель не добавляется.Null values are ignored and the corresponding separator is not added. Чтобы вернуть заполнитель для значений NULL, используйте функцию ISNULL, как показано в примере Б.To return a place holder for null values, use the ISNULL function as demonstrated in example B.

Функция STRING_AGG доступна на любом уровне совместимости.STRING_AGG is available in any compatibility level.

ПримерыExamples

A.A. Формирование списка имен, разделенного по строкамGenerate list of names separated in new lines

В приведенном ниже примере формируется список имен в одной результирующей ячейке, разделенный символами возврата каретки.The following example produces a list of names in a single result cell, separated with carriage returns.

SELECT STRING_AGG (FirstName, CHAR(13)) AS csv 
FROM Person.Person; 

Ниже приводится результирующий набор.Here is the result set.

csvcsv
SyedSyed
CatherineCatherine
KimKim
KimKim
KimKim
HazemHazem
......

Значения NULL, найденные в ячейках name, не возвращаются в результатах.NULL values found in name cells are not returned in result.

Примечание

Если в редакторе запросов Management Studio используется режим В виде сетки, символы возврата каретки не применяются.If using the Management Studio Query Editor, the Results to Grid option cannot implement the carriage return. Чтобы результирующий набор отображался правильно, перейдите в режим В виде текста.Switch to Results to Text to see the result set properly.

Б.B. Формирование списка имен, разделенного запятыми, без значений NULLGenerate list of names separated with comma without NULL values

В приведенном ниже примере значения NULL заменяются на "N/A" и имена, разделенные запятыми, возвращаются в одной результирующей ячейке.The following example replaces null values with 'N/A' and returns the names separated by commas in a single result cell.

SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv 
FROM Person.Person; 

Ниже приводится результирующий набор.Here is the result set.

CsvCsv
John,N/A,Mike,Peter,N/A,N/A,Alice,BobJohn,N/A,Mike,Peter,N/A,N/A,Alice,Bob

В.C. Формирование списка значений с разделителями-запятымиGenerate comma-separated values

SELECT 
STRING_AGG(CONCAT(FirstName, ' ', LastName, ' (', ModifiedDate, ')'), CHAR(13)) 
  AS names 
FROM Person.Person; 

Ниже приводится результирующий набор.Here is the result set.

именаnames
Ken Sánchez (Feb 8 2003 12:00AM)Ken Sánchez (Feb 8 2003 12:00AM)
Terri Duffy (Feb 24 2002 12:00AM)Terri Duffy (Feb 24 2002 12:00AM)
Roberto Tamburello (Dec 5 2001 12:00AM)Roberto Tamburello (Dec 5 2001 12:00AM)
Rob Walters (Dec 29 2001 12:00AM)Rob Walters (Dec 29 2001 12:00AM)
......

Примечание

Если в редакторе запросов Management Studio используется режим В виде сетки, символы возврата каретки не применяются.If using the Management Studio Query Editor, the Results to Grid option cannot implement the carriage return. Чтобы результирующий набор отображался правильно, перейдите в режим В виде текста.Switch to Results to Text to see the result set properly.

Статьи и их теги разнесены по разным таблицам.Article and their tags are separated into different tables. Разработчику необходимо получить одну строку для каждой статьи со всеми связанными тегами.Developer wants to return one row per each article with all associated tags. Используется следующий запрос:Using following query:

SELECT a.articleId, title, STRING_AGG (tag, ',') as tags
FROM dbo.Article AS a
LEFT JOIN dbo.ArticleTag AS t
    ON a.ArticleId = t.ArticleId
GROUP BY a.articleId, title;

Ниже приводится результирующий набор.Here is the result set.

articleIdarticleId titletitle tagstags
172172 Опросы предвещают напряженную борьбу на выборахPolls indicate close election results политика,опросы,муниципалитетpolitics,polls,city council
176176 Новая автострада разгрузит транспортные потокиNew highway expected to reduce congestion NULLNULL
177177 Собаки по-прежнему популярнее кошекDogs continue to be more popular than cats опросы,животныеpolls,animals

Примечание

Предложение GROUP BY является обязательным, если функция STRING_AGG не является единственным элементом в списке SELECT.The GROUP BY clause is required if the STRING_AGG function isn't the only item in the SELECT list.

Д.E. Формирование списка адресов электронной почты по городамGenerate list of emails per towns

Следующий запрос находит адреса электронной почты сотрудников и группирует их по городам:The following query finds the email addresses of employees and groups them by towns:

SELECT town, STRING_AGG (email, ';') AS emails 
FROM dbo.Employee 
GROUP BY town; 

Ниже приводится результирующий набор.Here is the result set.

towntown emailsemails
SeattleSeattle syed0@adventure-works.com;catherine0@adventure-works.com;kim2@adventure-works.comsyed0@adventure-works.com;catherine0@adventure-works.com;kim2@adventure-works.com
LALA sam1@adventure-works.com;hazem0@adventure-works.comsam1@adventure-works.com;hazem0@adventure-works.com

Адреса, возвращенные в столбце emails, можно использовать для рассылки сообщений группе людей, работающих в определенном городе.Emails returned in the emails column can be directly used to send emails to group of people working in some particular towns.

Е.F. Формирование отсортированного списка адресов электронной почты по городамGenerate a sorted list of emails per towns

Так же как в предыдущем примере, следующий запрос находит адреса электронной почты сотрудников, группирует их по городам и сортирует по алфавиту:Similar to previous example, the following query finds the email addresses of employees, groups them by town, and sorts the emails alphabetically:

SELECT town, 
    STRING_AGG (email, ';') WITHIN GROUP (ORDER BY email ASC) AS emails 
FROM dbo.Employee 
GROUP BY town; 

Ниже приводится результирующий набор.Here is the result set.

towntown emailsemails
SeattleSeattle catherine0@adventure-works.com;kim2@adventure-works.com;syed0@adventure-works.comcatherine0@adventure-works.com;kim2@adventure-works.com;syed0@adventure-works.com
LALA hazem0@adventure-works.com;sam1@adventure-works.comhazem0@adventure-works.com;sam1@adventure-works.com

См. также разделSee also

CONCAT (Transact-SQL)CONCAT (Transact-SQL)
CONCAT_WS (Transact-SQL)CONCAT_WS (Transact-SQL)
FORMATMESSAGE (Transact-SQL)FORMATMESSAGE (Transact-SQL)
QUOTENAME (Transact-SQL)QUOTENAME (Transact-SQL)
REPLACE (Transact-SQL)REPLACE (Transact-SQL)
REVERSE (Transact-SQL)REVERSE (Transact-SQL)
STRING_ESCAPE (Transact-SQL)STRING_ESCAPE (Transact-SQL)
STUFF (Transact-SQL)STUFF (Transact-SQL)
TRANSLATE (Transact-SQL)TRANSLATE (Transact-SQL)
Агрегатные функции (Transact-SQL)Aggregate Functions (Transact-SQL)
Строковые функции (Transact-SQL)String Functions (Transact-SQL)