STRING_SPLIT (T-SQL)
Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru Azure SQL Database Azure SQL Managed Instance Titik akhir analitik Azure Synapse Analytics SQL di Microsoft Fabric Warehouse di Microsoft Fabric
STRING_SPLIT
adalah fungsi bernilai tabel yang membagi string menjadi baris substring, berdasarkan karakter pemisah tertentu.
Tingkat kompatibilitas 130
STRING_SPLIT
memerlukan tingkat kompatibilitas setidaknya 130. Ketika tingkat kurang dari 130, Mesin Database tidak dapat menemukan STRING_SPLIT
fungsi.
Untuk mengubah tingkat kompatibilitas database, lihat Menampilkan atau mengubah tingkat kompatibilitas database.
Catatan
Konfigurasi kompatibilitas tidak diperlukan untuk STRING_SPLIT
di Azure Synapse Analytics.
Sintaks
STRING_SPLIT ( string , separator [ , enable_ordinal ] )
Argumen
tali
Ekspresi jenis karakter apa pun (misalnya, nvarchar, varchar, nchar, atau char).
pemisah
Ekspresi karakter tunggal dari jenis karakter apa pun (misalnya, nvarchar(1), varchar(1), nchar(1), atau char(1)) yang digunakan sebagai pemisah untuk substring yang digabungkan.
enable_ordinal
Berlaku untuk: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (hanya kumpulan SQL tanpa server), dan SQL Server 2022 (16.x) dan versi yang lebih baru
Ekspresi int atau bit yang berfungsi sebagai bendera untuk mengaktifkan atau menonaktifkan ordinal
kolom output. Nilai 1
mengaktifkan ordinal
kolom. Jika enable_ordinal dihilangkan, NULL
, atau memiliki nilai 0
, kolom dinonaktifkan ordinal
.
Jenis yang dikembalikan
ordinal
Jika kolom output tidak diaktifkan, STRING_SPLIT
mengembalikan tabel kolom tunggal yang barisnya adalah substring. Nama kolom adalah value
. Ini mengembalikan nvarchar jika salah satu argumen input adalah nvarchar atau nchar. Jika tidak, ia mengembalikan varchar. Panjang jenis pengembalian sama dengan panjang argumen string .
Jika argumen enable_ordinal diteruskan nilai 1
, kolom kedua bernama ordinal
dikembalikan yang terdiri dari nilai indeks berbasis 1 dari posisi setiap substring dalam string input. Jenis pengembaliannya besar.
Keterangan
STRING_SPLIT
memasukkan string yang memiliki substring yang dibatasi dan memasukkan satu karakter untuk digunakan sebagai pemisah atau pemisah. Secara opsional, fungsi mendukung argumen ketiga dengan nilai 0
atau 1
yang menonaktifkan atau mengaktifkan, masing-masing, ordinal
kolom output.
STRING_SPLIT
menghasilkan tabel kolom tunggal atau kolom ganda, tergantung pada argumen enable_ordinal .
Jika enable_ordinal adalah , dihilangkan
NULL
, atau memiliki nilai0
,STRING_SPLIT
mengembalikan tabel kolom tunggal yang barisnya berisi substring. Nama kolom output adalahvalue
.Jika enable_ordinal memiliki nilai
1
, fungsi mengembalikan tabel dua kolom, termasukordinal
kolom yang terdiri dari nilai indeks berbasis 1 dari substring dalam string input asli.
Argumen enable_ordinal harus berupa nilai konstanta, bukan kolom atau variabel. Ini juga harus berupa jenis data bit atau int dengan nilai 0
atau 1
. Jika tidak, fungsi akan menimbulkan kesalahan.
Baris output mungkin dalam urutan apa pun. Urutan tidak dijamin cocok dengan urutan substring dalam string input. Anda dapat mengambil alih urutan pengurutan akhir dengan menggunakan ORDER BY
klausul pada SELECT
pernyataan, misalnya, ORDER BY value
atau ORDER BY ordinal
.
0x0000
(char(0)) adalah karakter yang tidak terdefinisi dalam kolase Windows dan tidak dapat disertakan dalam STRING_SPLIT
.
Substring kosong panjang nol ada ketika string input berisi dua atau lebih kemunculan berturut-turut dari karakter pemisah. Substring kosong diperlakukan sama seperti substring biasa. Anda dapat memfilter baris apa pun yang berisi substring kosong dengan menggunakan WHERE
klausa, misalnya WHERE value <> ''
. Jika string input adalah NULL
, STRING_SPLIT
fungsi bernilai tabel mengembalikan tabel kosong.
Sebagai contoh, pernyataan berikut SELECT
menggunakan karakter spasi sebagai pemisah:
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');
Dalam eksekusi praktik, tabel hasil berikut yang dikembalikan sebelumnya SELECT
:
value |
---|
Lorem |
ipsum |
dolor |
sit |
amet. |
Contoh berikut mengaktifkan ordinal
kolom dengan meneruskan 1
argumen ketiga opsional:
SELECT * FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ', 1);
Pernyataan ini kemudian mengembalikan tabel hasil berikut:
value | ordinal |
---|---|
Lorem |
1 |
ipsum |
2 |
dolor |
3 |
sit |
4 |
amet. |
5 |
Contoh
J. Memisahkan string nilai yang dipisahkan koma
Uraikan daftar nilai yang dipisahkan koma dan kembalikan semua token yang tidak kosong:
DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'
SELECT value
FROM STRING_SPLIT(@tags, ',')
WHERE RTRIM(value) <> '';
STRING_SPLIT
mengembalikan string kosong jika tidak ada di antara pemisah. Kondisi RTRIM(value) <> ''
menghapus token kosong.
B. Memisahkan string nilai yang dipisahkan koma dalam kolom
Tabel produk memiliki kolom dengan daftar tag yang dipisahkan koma yang diperlihatkan dalam contoh berikut:
ProductId | Nama | Tag |
---|---|---|
1 |
Full-Finger Gloves |
clothing,road,touring,bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike,mountain |
Kueri berikut mengubah setiap daftar tag dan menggabungkannya dengan baris asli:
SELECT ProductId, Name, value
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',');
Berikut set hasilnya.
ProductId | Nama | Nilai |
---|---|---|
1 |
Full-Finger Gloves |
clothing |
1 |
Full-Finger Gloves |
road |
1 |
Full-Finger Gloves |
touring |
1 |
Full-Finger Gloves |
bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike |
3 |
HL Mountain Frame |
mountain |
Catatan
Urutan output mungkin bervariasi karena urutan tidak dijamin cocok dengan urutan substring dalam string input.
C. Agregasi menurut nilai
Pengguna harus membuat laporan yang menunjukkan jumlah produk per setiap tag, diurutkan berdasarkan jumlah produk, dan untuk memfilter hanya tag dengan lebih dari dua produk.
SELECT value as tag, COUNT(*) AS [number_of_articles]
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',')
GROUP BY value
HAVING COUNT(*) > 2
ORDER BY COUNT(*) DESC;
D. Cari berdasarkan nilai tag
Pengembang harus membuat kueri yang menemukan artikel berdasarkan kata kunci. Mereka dapat menggunakan kueri berikut:
Untuk menemukan produk dengan satu tag (pakaian):
SELECT ProductId, Name, Tags
FROM Product
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));
Temukan produk dengan dua tag tertentu (pakaian dan jalan):
SELECT ProductId, Name, Tags
FROM Product
WHERE EXISTS (SELECT *
FROM STRING_SPLIT(Tags, ',')
WHERE value IN ('clothing', 'road'));
E. Menemukan baris menurut daftar nilai
Pengembang harus membuat kueri yang menemukan artikel berdasarkan daftar ID. Mereka bisa menggunakan kueri berikut:
SELECT ProductId, Name, Tags
FROM Product
JOIN STRING_SPLIT('1,2,3',',')
ON value = ProductId;
Penggunaan sebelumnya STRING_SPLIT
adalah pengganti antipattern umum. Antipattern semacam itu dapat melibatkan pembuatan string SQL dinamis di lapisan aplikasi atau di Transact-SQL. Atau antipattern dapat dicapai dengan menggunakan LIKE
operator. Lihat contoh SELECT
pernyataan berikut:
SELECT ProductId, Name, Tags
FROM Product
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';
F. Menemukan baris menurut nilai ordinal
Pernyataan berikut menemukan semua baris dengan nilai indeks genap:
SELECT *
FROM STRING_SPLIT('Austin,Texas,Seattle,Washington,Denver,Colorado', ',', 1)
WHERE ordinal % 2 = 0;
Pernyataan di atas mengembalikan tabel berikut:
value | ordinal |
---|---|
Texas | 2 |
Washington | 4 |
Colorado | 6 |
G. Mengurutkan baris menurut nilai ordinal
Pernyataan berikut mengembalikan nilai substring terpisah dari string input dan nilai ordinalnya, yang diurutkan berdasarkan ordinal
kolom:
SELECT * FROM STRING_SPLIT('E-D-C-B-A', '-', 1) ORDER BY ordinal DESC;
Pernyataan di atas mengembalikan tabel berikut:
value | ordinal |
---|---|
A | 5 |
B | 4 |
C | 3 |
D | 2 |
E | 1 |