Sdílet prostřednictvím


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.

Transact-SQL konvence syntaxe

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) varchar(8000)
, bigint, smallint, tinyint, numerické, plovoucí, skutečné, bit,
desetinných, malé, peněz, datetime, datetime2
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.

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;...
  • STRING_ESCAPE (Transact-SQL)
  • STUFF (Transact-SQL)
  • CONCAT (Transact-SQL)
  • CONCAT_WS (Transact-SQL)
  • agregační funkce (Transact-SQL)
  • řetězcové funkce (Transact-SQL)