다음을 통해 공유


STRING_AGG (Transact-SQL)

Applies to: SQL Server 2017 (14.x) and later Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint in Microsoft FabricWarehouse 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자로 잘립니다. 이 제한을 늘리려면 각 열에 표시할 최대 문자 수 옵션을 변경합니다.

아티클과 해당 태그가 서로 다른 테이블로 구분되는 데이터베이스를 가정해 보겠습니다. 한 개발자가 각 아티클당 관련 태그가 모두 포함된 하나의 행을 반환하려고 합니다. 다음 쿼리는 이 결과를 실현합니다.

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 paige28@adventure-works.com;;joshua24@adventure-works.comjavier12@adventure-works.com; ...
Baltimore gilbert9@adventure-works.com
Barstow kristen4@adventure-works.com
Basingstoke Hants dale10@adventure-works.com;heidi9@adventure-works.com
Baytown kelvin15@adventure-works.com
Beaverton billy6@adventure-works.com;;dalton35@adventure-works.comlawrence1@adventure-works.com; ...
Bell Gardens christy8@adventure-works.com
Bellevue min0@adventure-works.com;;gigi0@adventure-works.comterry18@adventure-works.com; ...
Bellflower philip0@adventure-works.com;;emma34@adventure-works.comjorge8@adventure-works.com; ...
Bellingham christopher23@adventure-works.com;;frederick7@adventure-works.comomar0@adventure-works.com; ...

메일 열에 반환된 메일은 특정 도시에서 근무하는 사람들에게 메일을 전송하는 데 직접 사용할 수 있습니다.

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 kristen4@adventure-works.com
Basingstoke Hants dale10@adventure-works.com;heidi9@adventure-works.com
Braintree mindy20@adventure-works.com
Bell Gardens christy8@adventure-works.com
Byron louis37@adventure-works.com
Bordeaux ranjit0@adventure-works.com
Carnation don0@adventure-works.com;;douglas0@adventure-works.comgeorge0@adventure-works.com; ...
Boulogne-Billancourt allen12@adventure-works.com;;bethany15@adventure-works.comcarl5@adventure-works.com; ...
Berkshire barbara41@adventure-works.com;;brenda4@adventure-works.comcarrie14@adventure-works.com; ...
Berks adriana6@adventure-works.com;;alisha13@adventure-works.comarthur19@adventure-works.com; ...