Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server 2017 (14.x) dan versi
yang lebih baru Azure SQL Database
AzureSQL Managed Instance
AzureSynapse Analytics
Titik akhir analitik SQL di Microsoft Fabric
Warehouse di database Microsoft Fabric
SQL di Microsoft Fabric
Menggabungkan nilai ekspresi string dan menempatkan nilai pemisah di antaranya. Pemisah tidak ditambahkan di akhir string.
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Arguments
expression
Ekspresi jenis apa pun. Ekspresi dikonversi ke jenis nvarchar atau varchar selama perangkaian. Jenis non-string dikonversi ke jenis nvarchar .
separator
Ekspresi jenis nvarchar atau varchar yang digunakan sebagai pemisah untuk string yang digabungkan. Ini bisa harfiah atau variabel.
<order_clause>
Secara opsional tentukan urutan hasil yang digabungkan menggunakan WITHIN GROUP klausul:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>Daftar ekspresi non-konstanta yang dapat digunakan untuk mengurutkan hasil. Hanya satu
<order_by_expression_list>yang diizinkan per kueri. Urutan sortir default adalah menaik.
Tipe pengembalian
Jenis pengembalian tergantung pada argumen pertama (ekspresi). Jika argumen input adalah jenis string (nvarchar, varchar), jenis hasilnya sama dengan jenis input. Tabel berikut mencantumkan konversi otomatis:
| Jenis ekspresi input | Result |
|---|---|
| nvarchar(max) | nvarchar(max) |
| varchar(max) | varchar(max) |
| nvarchar(1..4000) | nvarchar(4000) |
| varchar(1..8000) | varchar(8000) |
|
int, bigint, smallint, tinyint, numerik, float, nyata, bit, desimal, smallmoney, uang, tanggalwaktu, datetime2 |
nvarchar(4000) |
Remarks
STRING_AGG adalah fungsi agregat yang mengambil semua ekspresi dari baris dan menggabungkannya menjadi satu string. Nilai ekspresi dikonversi secara implisit ke jenis string lalu digabungkan. Konversi implisit ke string mengikuti aturan yang ada untuk konversi jenis data. Untuk informasi selengkapnya tentang konversi jenis data, lihat CAST dan CONVERT.
Jika ekspresi input adalah jenis varchar, pemisah tidak dapat diketik nvarchar.
Nilai null diabaikan dan pemisah yang sesuai tidak ditambahkan. Untuk mengembalikan place holder untuk nilai null, gunakan fungsi seperti yang ISNULL ditunjukkan dalam contoh B.
STRING_AGG tersedia dalam tingkat kompatibilitas apa pun.
Note
<order_clause> tersedia dengan tingkat kompatibilitas database 110 ke atas.
Examples
Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.
A. Hasilkan daftar nama yang dipisahkan dalam baris baru
Contoh berikut menghasilkan daftar nama dalam satu sel hasil, dipisahkan dengan pengembalian pengangkutan.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Berikut set hasilnya.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
NULL nilai yang ditemukan dalam name sel tidak dikembalikan dalam hasilnya.
Note
Jika Anda menggunakan Editor Kueri SQL Server Management Studio, opsi Hasil ke Kisi tidak dapat menerapkan pengembalian pengangkutan. Beralih ke Hasil ke Teks untuk melihat hasil yang diatur dengan benar. Hasil ke Teks dipotong menjadi 256 karakter secara default. Untuk menambah batas ini, ubah opsi Jumlah maksimum karakter yang ditampilkan di setiap kolom .
B. Hasilkan daftar nama tengah yang dipisahkan dengan koma tanpa nilai NULL
Contoh berikut mengganti NULL nilai dengan N/A dan mengembalikan nama yang dipisahkan oleh koma dalam satu sel hasil.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Berikut adalah kumpulan hasil yang dipangkas.
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. Hasilkan nilai yang dipisahkan koma
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Berikut adalah kumpulan hasil yang dipangkas.
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
Jika Anda menggunakan Editor Kueri SQL Server Management Studio, opsi Hasil ke Kisi tidak dapat menerapkan pengembalian pengangkutan. Beralih ke Hasil ke Teks untuk melihat hasil yang diatur dengan benar. Hasil ke Teks dipotong menjadi 256 karakter secara default. Untuk menambah batas ini, ubah opsi Jumlah maksimum karakter yang ditampilkan di setiap kolom .
D. Mengembalikan artikel berita dengan tag terkait
Bayangkan database tempat artikel dan tagnya dipisahkan menjadi tabel yang berbeda. Pengembang ingin mengembalikan satu baris per setiap artikel dengan semua tag terkait. Kueri berikut mencapai hasil ini:
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
Berikut set hasilnya.
| 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
Klausa GROUP BY diperlukan jika STRING_AGG fungsi bukan satu-satunya item dalam SELECT daftar.
E. Membuat daftar email per kota
Kueri berikut menemukan alamat email karyawan dan mengelompokkannya berdasarkan kota:
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
Berikut adalah kumpulan hasil yang dipangkas.
| City | emails |
|---|---|
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 ... |
Email yang dikembalikan di kolom email dapat langsung digunakan untuk mengirim email ke sekelompok orang yang bekerja di beberapa kota tertentu.
F. Membuat daftar email yang diurutkan per kota
Mirip dengan contoh sebelumnya, kueri berikut menemukan alamat email karyawan, mengelompokkannya menurut kota, dan mengurutkan email menurut abjad:
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
Berikut adalah kumpulan hasil yang dipangkas.
| 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.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 ... |