STRING_AGG (Transact-SQL)
platí pro: SQL Server 2017 (14.x) a novější Azure SQL DatabaseAzure SQL Managed Instancekoncový bod analýzy SQL Azure Synapse Analyticssql Analytics v Microsoft FabricWarehouse v Microsoft Fabric
Zřetězí hodnoty řetězcových výrazů a umístí hodnoty oddělovače mezi ně. Oddělovač se nepřidá na konec řetězce.
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Argumenty
výrazu
Výraz libovolného typu. Výrazy se během zřetězení převedou na nvarchar nebo typy varchar. Typy bez řetězce se převedou na typ nvarchar.
oddělovač
Výraz typu nvarchar nebo varchar, který se používá jako oddělovač pro zřetězené řetězce. Může to být literál nebo proměnná.
<order_clause>
Volitelně můžete zadat pořadí zřetězených výsledků pomocí klauzule WITHIN GROUP
:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>
Seznam nestátných výrazů , které lze použít k řazení výsledků. Pro každý dotaz je povolen pouze jeden
<order_by_expression_list>
. Výchozí pořadí řazení je vzestupné.
Návratové typy
Návratový typ závisí na prvním argumentu (výrazu). Pokud je vstupním argumentem typ řetězce (nvarchar, varchar), typ výsledku je stejný jako typ vstupu. V následující tabulce jsou uvedeny automatické převody:
Typ vstupního výrazu | Výsledek |
---|---|
nvarchar(max) | nvarchar(max) |
varchar(max) | varchar(max) |
nvarchar(1..4000) | nvarchar(4000) |
varchar(1..8000) | |
, bigint, smallint, tinyint, numerické, plovoucí, skutečné, bit, |
nvarchar(4000) |
Poznámky
STRING_AGG
je agregační funkce, která přebírá všechny výrazy z řádků a zřetězí je do jednoho řetězce. Hodnoty výrazů jsou implicitně převedeny na typy řetězců a pak zřetězeny. Implicitní převod na řetězce se řídí existujícími pravidly pro převody datových typů. Další informace o převodech datových typů naleznete v tématu CAST a CONVERT.
Pokud je vstupní výraz typu varchar, oddělovač nemůže být typ nvarchar.
Hodnoty null se ignorují a odpovídající oddělovač se nepřidá. Chcete-li vrátit držitel místa pro hodnoty null, použijte funkci ISNULL
, jak je znázorněno v příkladu B.
STRING_AGG
je k dispozici na libovolné úrovni kompatibility.
Poznámka
<order_clause>
je k dispozici s úrovní kompatibility databáze 110 a vyšší.
Příklady
Ukázky kódu Transact-SQL v tomto článku používají AdventureWorks2022
nebo AdventureWorksDW2022
ukázkovou databázi, kterou si můžete stáhnout z domovské stránky ukázky Microsoft SQL Serveru a projekty komunity.
A. Generování seznamu názvů oddělených v nových řádcích
Následující příklad vytvoří seznam názvů v jedné výsledné buňce oddělené návratem na začátek řádku.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Tady je sada výsledků.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
NULL
hodnoty nalezené v name
buňkách se ve výsledku nevracejí.
Poznámka
Pokud používáte Editor dotazů aplikace SQL Server Management Studio, možnost Výsledky do mřížky nemůže implementovat návrat na začátek řádku. Pokud chcete správně zobrazit sadu výsledků, přepněte na Výsledky na text. Výsledky na text jsou ve výchozím nastavení zkráceny na 256 znaků. Pokud chcete tento limit zvýšit, změňte Maximální počet znaků zobrazených v každém sloupci možnost.
B. Generování seznamu názvů oddělených čárkami bez NULL
hodnot
Následující příklad nahradí hodnoty null 'N/A' a vrátí názvy oddělené čárkami v jedné výsledné buňce.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(FirstName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Tady je oříznutá sada výsledků.
csv
-----
Syed,Catherine,Kim,Kim,Kim,Hazem,Sam,Humberto,Gustavo,Pilar,Pilar, ...
C. Generování hodnot oddělených čárkami
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Tady je oříznutá sada výsledků.
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)
...
Poznámka
Pokud používáte Editor dotazů v sadě Management Studio, možnost Výsledky do mřížky nemůže implementovat návrat na začátek řádku. Pokud chcete správně zobrazit sadu výsledků, přepněte na Výsledky na text.
D. Vrácení příspěvků se souvisejícími značkami
Představte si databázi, ve které jsou články a jejich značky oddělené do různých tabulek. Vývojář chce vrátit jeden řádek pro každý článek se všemi přidruženými značkami. Následující dotaz dosáhne tohoto výsledku:
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
Tady je sada výsledků.
articleId | titul | visačky |
---|---|---|
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 |
Poznámka
Klauzule GROUP BY
se vyžaduje, pokud STRING_AGG
funkce není jedinou položkou v seznamu SELECT
.
E. Generování seznamu e-mailů na města
Následující dotaz najde e-mailové adresy zaměstnanců a seskupí je podle města:
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
Tady je sada výsledků.
Poznámka
Výsledky se zobrazují oříznuté.
Město | e-maily |
---|---|
Ballard |
paige28@adventure-works.com ;joshua24@adventure-works.com ;javier12@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.com ;lawrence1@adventure-works.com ;... |
Bell Gardens |
christy8@adventure-works.com |
Bellevue |
min0@adventure-works.com ;gigi0@adventure-works.com ;terry18@adventure-works.com ;... |
Bellflower |
philip0@adventure-works.com ;emma34@adventure-works.com ;jorge8@adventure-works.com ;... |
Bellingham |
christopher23@adventure-works.com ;frederick7@adventure-works.com ;omar0@adventure-works.com ;... |
E-maily vrácené ve sloupci e-mailů se dají použít přímo k odesílání e-mailů skupině lidí pracujících v některých konkrétních městech.
F. Generování seřazeného seznamu e-mailů pro jednotlivá města
Podobně jako v předchozím příkladu následující dotaz najde e-mailové adresy zaměstnanců, seskupí je podle města a seřadí e-maily abecedně:
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
Tady je sada výsledků.
Poznámka
Výsledky se zobrazují oříznuté.
Město | E-maily |
---|---|
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.com ;george0@adventure-works.com ;... |
Boulogne-Billancourt |
allen12@adventure-works.com ;bethany15@adventure-works.com ;carl5@adventure-works.com ;... |
Berkshire |
barbara41@adventure-works.com ;brenda4@adventure-works.com ;carrie14@adventure-works.com ;... |
Berks |
adriana6@adventure-works.com ;alisha13@adventure-works.com ;arthur19@adventure-works.com ;... |
Související obsah
-
STRING_ESCAPE (Transact-SQL) -
STUFF (Transact-SQL) -
CONCAT (Transact-SQL) -
CONCAT_WS (Transact-SQL) - agregační funkce
(Transact-SQL) -
řetězcové funkce (Transact-SQL)