STRING_AGG (Transact-SQL)
gäller för: SQL Server 2017 (14.x) och senare Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft Fabric
Sammanfogar värdena för stränguttryck och placerar avgränsarvärden mellan dem. Avgränsaren läggs inte till i slutet av strängen.
Transact-SQL syntaxkonventioner
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Argument
uttryck
Ett uttryck av vilken typ som helst. Uttryck konverteras till nvarchar eller varchar typer under sammanfogning. Icke-strängtyper konverteras till nvarchar typ.
avgränsare
Ett uttryck av nvarchar eller varchar typ som används som avgränsare för sammanfogade strängar. Det kan vara literal eller variabel.
<order_clause>
Du kan också ange ordningen på sammanfogade resultat med hjälp av WITHIN GROUP
-satsen:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>
En lista över icke-konstanta uttryck som kan användas för sortering av resultat. Endast en
<order_by_expression_list>
tillåts per fråga. Standardsorteringsordningen är stigande.
Returtyper
Returtypen beror på första argumentet (uttrycket). Om indataargumentet är strängtypen (nvarchar, varchar) är resultattypen samma som indatatypen. I följande tabell visas automatiska konverteringar:
Typ av indatauttryck | Resultat |
---|---|
nvarchar(max) | nvarchar(max) |
varchar(max) | varchar(max) |
nvarchar(1...4000) | nvarchar(4000) |
varchar(1..8000) | varchar(8000) |
int, bigint, smallint, tinyint, numeriska, float, verklig, bit, decimal, smallmoney, money, datetime, datetime2 |
nvarchar(4000) |
Anmärkningar
STRING_AGG
är en mängdfunktion som tar alla uttryck från rader och sammanfogar dem till en enda sträng. Uttrycksvärden konverteras implicit till strängtyper och sammanfogas sedan. Den implicita konverteringen till strängar följer de befintliga reglerna för datatypskonverteringar. Mer information om datatypkonverteringar finns i CAST och CONVERT.
Om indatauttrycket är typ varcharkan avgränsaren inte vara typ nvarchar.
Null-värden ignoreras och motsvarande avgränsare läggs inte till. Om du vill returnera en platshållare för null-värden använder du funktionen ISNULL
enligt exempel B.
STRING_AGG
är tillgängligt på valfri kompatibilitetsnivå.
Not
<order_clause>
är tillgängligt med databaskompatibilitetsnivå 110 och senare.
Exempel
I Transact-SQL kodexempel i den här artikeln används AdventureWorks2022
- eller AdventureWorksDW2022
-exempeldatabasen, som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.
A. Generera lista med namn avgränsade i nya rader
I följande exempel skapas en lista med namn i en enda resultatcell, avgränsad med vagnreturer.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Här är resultatuppsättningen.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
NULL
värden som finns i name
celler returneras inte i resultatet.
Not
Om du använder SQL Server Management Studio Query Editor kan alternativet Results to Grid inte implementera vagnreturen. Växla till Resultat till Text för att se resultatet korrekt inställt. Resultatet till Text trunkeras som standard till 256 tecken. Om du vill öka den här gränsen ändrar du Maximalt antal tecken som visas i varje kolumn alternativ.
B. Generera en lista med namn avgränsade med kommatecken utan NULL
värden
I följande exempel ersätts null-värden med "N/A" och namnen som avgränsas med kommatecken i en enda resultatcell returneras.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(FirstName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Här är en trimmad resultatuppsättning.
csv
-----
Syed,Catherine,Kim,Kim,Kim,Hazem,Sam,Humberto,Gustavo,Pilar,Pilar, ...
C. Generera kommaavgränsade värden
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Här är en trimmad resultatuppsättning.
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)
...
Not
Om du använder Management Studio-frågeredigeraren kan alternativet Resultat till rutnät inte implementera vagnreturen. Växla till Resultat till Text för att se resultatet korrekt inställt.
D. Returnera nyhetsartiklar med relaterade taggar
Föreställ dig en databas där artiklar och deras taggar är uppdelade i olika tabeller. En utvecklare vill returnera en rad per artikel med alla associerade taggar. Följande fråga uppnår det här resultatet:
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
Här är resultatuppsättningen.
articleId | titel | Taggar |
---|---|---|
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 |
Not
Satsen GROUP BY
krävs om funktionen STRING_AGG
inte är det enda objektet i listan SELECT
.
E. Generera en lista över e-postmeddelanden per ort
Följande fråga hittar de anställdas e-postadresser och grupperar dem efter stad:
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
Här är resultatuppsättningen.
Not
Resultaten visas trimmade.
Stad | e-postmeddelanden |
---|---|
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-postmeddelanden som returneras i e-postkolumnen kan användas direkt för att skicka e-postmeddelanden till en grupp personer som arbetar i vissa städer.
F. Generera en sorterad lista med e-postmeddelanden per ort
I likhet med föregående exempel hittar följande fråga anställdas e-postadresser, grupperar dem efter stad och sorterar e-postmeddelandena alfabetiskt:
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
Här är resultatuppsättningen.
Not
Resultaten visas trimmade.
Stad | E-postmeddelanden |
---|---|
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 ;... |