Aracılığıyla paylaş


STRING_SPLIT (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsSQL analiz uç noktası Microsoft Fabric'teki Microsoft FabricSQL veritabanında Microsoft Fabric'te

STRING_SPLIT , bir dizeyi belirtilen ayırıcı karaktere göre alt dize satırlarına bölen tablo değerli bir işlevdir.

Uyumluluk düzeyi 130

STRING_SPLIT uyumluluk düzeyinin en az 130 olmasını gerektirir. Düzey 130'dan küçük olduğunda, Veritabanı Altyapısı işlevi bulamaz STRING_SPLIT .

Veritabanının uyumluluk düzeyini değiştirmek için veritabanının uyumluluk düzeyini görüntüleme veya değiştirme bölümüne bakın.

Uyarı

Azure Synapse Analytics'te için STRING_SPLIT uyumluluk yapılandırması gerekli değildir.

Transact-SQL söz dizimi kuralları

Sözdizimi

STRING_SPLIT ( string , separator [ , enable_ordinal ] )

Arguments

string

Herhangi bir karakter türünün ifadesi (örneğin, nvarchar, varchar, nchar veya char).

ayırıcı

Birleştirilmiş alt dizeler için ayırıcı olarak kullanılan herhangi bir karakter türünün (örneğin, nvarchar(1), varchar(1), nchar(1)veya char(1)) tek bir karakter ifadesi.

enable_ordinal

Şunlar için geçerlidir: Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, Azure Synapse Analytics (yalnızca sunucusuz SQL havuzu) ve SQL Server 2022 (16.x) ve sonraki sürümleri

Çıkış sütununu etkinleştirmek veya devre dışı bırakmak için bayrak görevi görecek bir int veya bitordinal. değeri 1 sütunu etkinleştirir ordinal . enable_ordinal atlanırsa NULLveya değerine 0ordinal sahipse sütun devre dışı bırakılır.

Dönüş türleri

ordinal Çıkış sütunu etkinleştirilmemişse, STRING_SPLIT satırları alt dize olan tek sütunlu bir tablo döndürür. Sütunun adı şeklindedir value. Giriş bağımsız değişkenlerinden herhangi biri nvarchar veya nchar ise nvarchar döndürür. Aksi takdirde , varchar döndürür. Dönüş türünün uzunluğu , dize bağımsız değişkeninin uzunluğuyla aynıdır.

enable_ordinal bağımsız değişkenine 1değeri geçirilirse, her alt dizenin giriş dizesindeki konumunun 1 tabanlı dizin değerlerinden oluşan adlı ordinal ikinci bir sütun döndürülür. Dönüş türü bigint'tir.

Açıklamalar

STRING_SPLIT sınırlandırılmış alt dizeleri olan bir dizeyi girer ve sınırlayıcı veya ayırıcı olarak kullanmak üzere bir karakter girer. İsteğe bağlı olarak işlev, sırasıyla 0 çıkış sütununu 1ordinal devre dışı bırakabilen veya etkinleştiren veya değerine sahip üçüncü bir bağımsız değişkeni destekler.

STRING_SPLIT enable_ordinal bağımsız değişkenine bağlı olarak tek sütunlu veya çift sütunlu bir tablo oluşturur.

  • enable_ordinal atlanırsa NULLveya değerine 0STRING_SPLIT sahipse, satırları alt dizeleri içeren tek sütunlu bir tablo döndürür. Çıkış sütununun adı şeklindedir value.

  • enable_ordinal değeri 1varsa işlev, ordinal özgün giriş dizesindeki alt dizelerin 1 tabanlı dizin değerlerinden oluşan sütunu içeren iki sütunlu bir tablo döndürür.

enable_ordinal bağımsız değişkeni, sütun veya değişken değil sabit bir değer olmalıdır. Ayrıca veya değerine sahip 0 veya 1 veri türü olmalıdır. Aksi takdirde işlev bir hata oluşturur.

Çıkış satırları herhangi bir sırada olabilir. Sıranın giriş dizesindeki alt dizelerin sırasıyla eşleşmesi garanti değildir . Deyiminde veya gibi ORDER BYSELECTbir ORDER BY value yan tümce ORDER BY ordinal kullanarak son sıralama düzenini geçersiz kılabilirsiniz.

0x0000 (char(0)), Windows harmanlamalarında tanımlanmamış bir karakterdir ve içine STRING_SPLITeklenemez.

Giriş dizesi sınırlayıcı karakterinin iki veya daha fazla ardışık tekrarını içerdiğinde boş sıfır uzunluklu alt dizeler bulunur. Boş alt dizeler, düz alt dizelerle aynı şekilde işlenir. Boş alt dize içeren satırları, örneğin WHEREyan tümcesini WHERE value <> '' kullanarak filtreleyebilirsiniz. Giriş dizesi ise NULL, STRING_SPLIT tablo değerli işlevi boş bir tablo döndürür.

Örneğin, aşağıdaki SELECT deyim ayırıcı olarak boşluk karakterini kullanır:

SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');

Bir alıştırma çalıştırmasında, yukarıdaki SELECT aşağıdaki sonuç tablosunu döndürdü:

value
Lorem
ipsum
dolor
sit
amet.

Aşağıdaki örnek, isteğe bağlı üçüncü bağımsız değişkeni geçirerek ordinal sütunu etkinleştirir1:

SELECT * FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ', 1);

Bu deyim daha sonra aşağıdaki sonuç tablosunu döndürür:

value Sıralı
Lorem 1
ipsum 2
dolor 3
sit 4
amet. 5

Örnekler

A. Virgülle ayrılmış değer dizesini bölme

Değerlerin virgülle ayrılmış listesini ayrıştırın ve boş olmayan tüm belirteçleri döndürür:

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'

SELECT value
FROM STRING_SPLIT(@tags, ',')
WHERE RTRIM(value) <> '';

STRING_SPLIT ayırıcı arasında hiçbir şey yoksa boş bir dize döndürür. Koşul RTRIM(value) <> '' boş belirteçleri kaldırır.

B. Sütunda virgülle ayrılmış değer dizesini bölme

Ürün tablosunda, aşağıdaki örnekte gösterilen etiketlerin virgülle ayrılmış listesini içeren bir sütun vardır:

Ürün Kimliği İsim Etiketler
1 Full-Finger Gloves clothing,road,touring,bike
2 LL Headset bike
3 HL Mountain Frame bike,mountain

Aşağıdaki sorgu, her etiket listesini dönüştürür ve bunları özgün satırla birleştirir:

SELECT ProductId, Name, value
FROM Product
    CROSS APPLY STRING_SPLIT(Tags, ',');

Sonuç kümesi aşağıdadır.

Ürün Kimliği İsim Değer
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

Uyarı

Çıkış sırası, giriş dizesindeki alt dizelerin sırasıyla eşleşmesi garanti edilmediğinden değişebilir.

C. Değerlere göre toplama

Kullanıcıların her etikete göre ürün sayısını gösteren, ürün sayısına göre sıralanmış bir rapor oluşturması ve yalnızca ikiden fazla ürün içeren etiketleri filtrelemesi gerekir.

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. Etiket değerine göre arama

Geliştiricilerin makaleleri anahtar sözcüklere göre bulayan sorgular oluşturması gerekir. Aşağıdaki sorguları kullanabilirler:

Tek etiketli (giyim) ürünleri bulmak için:

SELECT ProductId, Name, Tags
FROM Product
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));

Belirtilen iki etikete (giyim ve yol) sahip ürünleri bulun:

SELECT ProductId, Name, Tags
FROM Product
WHERE EXISTS (SELECT *
    FROM STRING_SPLIT(Tags, ',')
    WHERE value IN ('clothing', 'road'));

E. Değerlerin listesine göre satırları bulma

Geliştiricilerin, kimlik listesine göre makaleleri bulan bir sorgu oluşturması gerekir. Aşağıdaki sorguyu kullanabilirler:

SELECT ProductId, Name, Tags
FROM Product
JOIN STRING_SPLIT('1,2,3',',')
    ON value = ProductId;

Önceki STRING_SPLIT kullanım, yaygın bir kötü modelin yerini alır. Böyle bir kötü model, uygulama katmanında veya Transact-SQL'de dinamik bir SQL dizesi oluşturmayı içerebilir. Alternatif olarak, bir kötü model işleci kullanılarak LIKE elde edilebilir. Aşağıdaki örnek SELECT deyimine bakın:

SELECT ProductId, Name, Tags
FROM Product
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';

F. Sıralı değerlere göre satırları bulma

Aşağıdaki deyim çift dizin değerine sahip tüm satırları bulur:

SELECT *
FROM STRING_SPLIT('Austin,Texas,Seattle,Washington,Denver,Colorado', ',', 1)
WHERE ordinal % 2 = 0;

Yukarıdaki deyim aşağıdaki tabloyu döndürür:

value Sıralı
Texas 2
Washington 4
Colorado 6

G. Sıra değerlerine göre satırları sıralama

Aşağıdaki deyim, giriş dizesinin bölünmüş alt dize değerlerini ve sütuna göre ordinal sıralanmış sıralı sıra değerlerini döndürür:

SELECT * FROM STRING_SPLIT('E-D-C-B-A', '-', 1) ORDER BY ordinal DESC;

Yukarıdaki deyim aşağıdaki tabloyu döndürür:

value Sıralı
A 5
B 4
C 3
D 2
E 1