STRING_AGG(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server 2017(14.x) 이상 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics SQL 분석 엔드포인트
문자열 식의 값을 연결하고 그 사이에 구분 기호 값을 추가합니다. 구분 기호는 문자열 끝에 추가되지 않습니다.
구문
STRING_AGG ( expression, separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
인수
expression
모든 형식의 식입니다. 식은 연결 중 NVARCHAR
또는 VARCHAR
형식으로 변환됩니다. 문자열이 아닌 형식은 NVARCHAR
형식으로 변환됩니다.
separator
연결된 문자열의 구분 기호로 사용되는 또는 형식의 NVARCHAR
식VARCHAR
입니다. 리터럴 또는 변수일 수 있습니다.
<order_clause>
또는 WITHIN GROUP
절을 사용하여 연결된 결과의 순서를 지정합니다.
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>
결과 정렬에 사용할 수 있는 비상수 식의 목록입니다. order_by_expression
은 하나만 허용됩니다. 기본 정렬 순서는 오름차순입니다.
반환 형식
반환 형식은 첫 번째 인수(식)에 따라 다릅니다. 입력 인수가 문자열 형식(NVARCHAR
, VARCHAR
)인 경우 결과 형식은 입력 형식과 동일합니다. 다음 표에 자동 변환이 나열되어 있습니다.
입력 식 형식 | 결과 |
---|---|
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) |
설명
STRING_AGG
는 행의 모든 식을 하나의 문자열로 연결하는 집계 함수입니다. 식 값은 문자열 형식으로 암시적으로 변환된 다음, 연결됩니다. 문자열에 대한 암시적 변환은 데이터 형식 변환에 대한 기존 규칙을 따릅니다. 데이터 형식 변환에 대한 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하십시오.
입력 식이 VARCHAR
형식인 경우 구분 기호의 형식은 NVARCHAR
가 될 수 없습니다.
Null 값이 무시되고 해당 구분 기호는 추가되지 않습니다. null 값의 자리 표시자를 반환하려면 예제 B와 같이 ISNULL
함수를 사용하세요.
STRING_AGG
는 모든 호환성 수준에서 사용할 수 있습니다.
참고
<order_clause>
는 데이터베이스 호환성 수준 110 이상에서 사용할 수 있습니다.
예
이 문서의 예제는 대부분 AdventureWorks 샘플 데이터베이스를 참조합니다.
A. 새 줄에 구분된 이름 목록 생성
다음 예에서는 단일 결과 셀에서 캐리지 리턴으로 구분된 이름 목록을 만듭니다.
USE AdventureWorks2022;
GO
SELECT STRING_AGG (CONVERT(NVARCHAR(max),FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
결과 집합은 다음과 같습니다.
csv |
---|
Syed 캐서린 김 김 김 Hazem ... |
name
셀에 있는 NULL
값은 결과로 반환되지 않습니다.
참고
SQL Server Management Studio Query Editor를 사용하는 경우 표 형태로 결과 표시 옵션으로 캐리지 리턴을 구현할 수 없습니다. 결과 집합을 올바르게 보려면 텍스트로 결과 표시로 전환하세요.
텍스트에 대한 결과는 기본적으로 256자로 잘립니다. 이 제한을 늘리려면 각 열에 표시할 최대 문자 수 옵션을 변경합니다.
B. NULL 값 없이 쉼표로 구분된 이름 목록 생성
다음 예는 null 값을 '해당 없음'으로 대체하고 하나의 결과 셀에 쉼표로 구분된 이름을 반환합니다.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT(NVARCHAR(max), ISNULL(FirstName,'N/A')), ',') AS csv
FROM Person.Person;
GO
결과 집합은 다음과 같습니다.
참고 항목
결과는 잘린 것으로 표시됩니다.
csv |
---|
Syed,Catherine,Kim,Kim,Kim,Hazem,Sam,Humberto,Gustavo,Pilar,Pilar, ... |
C. 쉼표로 구분된 값 생성
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT(NVARCHAR(max), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
결과 집합은 다음과 같습니다.
참고 항목
결과는 잘린 것으로 표시됩니다.
이름 |
---|
켄 산체스 (2003년 2월 8일 오전 12:00) 테리 더피 (2002년 2월 24일 오전 12:00) 로베르토 탐부렐로 (2001년 12월 5일 오전 12:00) 롭 월터스 (2001년 12월 29일 오전 12:00) ... |
참고
Management Studio Query Editor를 사용하는 경우 표 형태로 결과 표시 옵션으로 캐리지 리턴을 구현할 수 없습니다. 결과 집합을 올바르게 보려면 텍스트로 결과 표시로 전환하세요.
D. 뉴스 기사 및 관련 태그 반환
아티클과 해당 태그가 서로 다른 테이블로 구분되는 데이터베이스를 가정해 보겠습니다. 한 개발자가 각 아티클당 관련 태그가 모두 포함된 하나의 행을 반환하려고 합니다. 다음 쿼리는 이 결과를 실현합니다.
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;
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 |
참고
STRING_AGG
함수가 SELECT
목록의 유일한 항목이 아닌 경우 GROUP BY
절이 필요합니다.
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; ... |
벨링햄 | 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 | 전자 메일 |
---|---|
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; ... |
다음 단계
다음 문서에서 Transact-SQL 함수에 대해 자세히 알아보세요.