Udostępnij za pomocą


STRING_SPLIT (Transact-SQL)

Dotyczy: SQL Server 2016 (13.x) i nowsze wersje usługi Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics— punkt końcowy analizy SQL w usłudze Microsoft FabricWarehouse wbazie danych Microsoft Fabric SQL Database w usłudze Microsoft Fabric

STRING_SPLIT to funkcja wartości tabeli, która dzieli ciąg na wiersze podciągów na podstawie określonego znaku separatora.

Poziom zgodności 130

STRING_SPLIT wymaga, aby poziom zgodności był co najmniej 130. Gdy poziom jest mniejszy niż 130, aparat bazy danych nie może odnaleźć STRING_SPLIT funkcji.

Aby zmienić poziom zgodności bazy danych, zobacz Wyświetlanie lub zmienianie poziomu zgodności bazy danych.

Uwaga / Notatka

Konfiguracja zgodności nie jest wymagana w STRING_SPLIT usłudze Azure Synapse Analytics.

Transact-SQL konwencje składni

Składnia

STRING_SPLIT ( string , separator [ , enable_ordinal ] )

Arguments

string

Wyrażenie dowolnego typu znaku (na przykład nvarchar, varchar, nchar lub char).

separator

Jednoznakowe wyrażenie dowolnego typu znaku (na przykład nvarchar(1),varchar(1), nchar(1)lub char(1)), które jest używane jako separator dla podciągów połączonych.

enable_ordinal

Dotyczy: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (tylko bezserwerowa pula SQL) i SQL Server 2022 (16.x) i nowsze wersje

Wyrażenieint lub bit, które służy jako flaga umożliwiająca włączenie lub wyłączenie kolumny wyjściowejordinal. Wartość parametru 1 umożliwia kolumnę ordinal . Jeśli enable_ordinal zostanie pominięta, NULLlub ma wartość 0, kolumna ordinal jest wyłączona.

Typy zwracane

Jeśli kolumna ordinal wyjściowa nie jest włączona, zwraca tabelę z jedną kolumną, STRING_SPLIT której wiersze są podciągami. Nazwa kolumny to value. Zwraca wartość nvarchar , jeśli którykolwiek z argumentów wejściowych to nvarchar lub nchar. W przeciwnym razie zwraca wartość varchar. Długość typu zwracanego jest taka sama jak długość argumentu ciągu .

Jeśli argument enable_ordinal jest przekazywany wartość 1, zwracana jest druga kolumna o nazwie ordinal , która składa się z 1-opartych wartości indeksu pozycji każdego podciągu w ciągu wejściowym. Zwracany typ to bigint.

Uwagi

STRING_SPLIT wprowadza ciąg, który ma rozdzielone podciągi i wprowadza jeden znak do użycia jako ogranicznik lub separator. Opcjonalnie funkcja obsługuje trzeci argument z wartością 0 lub 1 , która wyłącza lub włącza odpowiednio lub włącza kolumnę wyjściową ordinal .

STRING_SPLIT zwraca jednokolumną lub dwukolumną tabelę w zależności od argumentu enable_ordinal .

  • Jeśli enable_ordinal to NULL, pominięta lub ma wartość 0, STRING_SPLIT zwraca jednokolumny tabelę, której wiersze zawierają podciągy. Nazwa kolumny wyjściowej to value.

  • Jeśli enable_ordinal ma wartość 1, funkcja zwraca tabelę dwukolumna, w tym ordinal kolumnę składającą się z 1 wartości indeksu podciągów w oryginalnym ciągu wejściowym.

Argument enable_ordinal musi być stałą wartością, a nie kolumną ani zmienną. Musi to być również typ danych bitowych lub int z wartością 0 lub 1. W przeciwnym razie funkcja zgłasza błąd.

Wiersze wyjściowe mogą być w dowolnej kolejności. Kolejność nie jest gwarantowana, aby pasować do kolejności podciągów w ciągu wejściowym. Ostateczną kolejność sortowania można zastąpić przy użyciu ORDER BY klauzuli w instrukcji SELECT , na przykład ORDER BY value lub ORDER BY ordinal.

0x0000 (char(0)) jest niezdefiniowanym znakiem sortowania systemu Windows i nie można go uwzględnić w pliku STRING_SPLIT.

Puste podciągi o zerowej długości są obecne, gdy ciąg wejściowy zawiera co najmniej dwa kolejne wystąpienia znaku ogranicznika. Puste podciągniki są traktowane tak samo jak zwykłe podciągy. Możesz odfiltrować wszystkie wiersze zawierające pusty podciąg, używając klauzuli WHERE , na przykład WHERE value <> ''. Jeśli ciąg wejściowy to NULL, STRING_SPLIT funkcja table-valued zwraca pustą tabelę.

Na przykład poniższa SELECT instrukcja używa znaku spacji jako separatora:

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

W ramach przebiegu praktyki poprzednia SELECT tabela wyników zwróciła następującą tabelę wyników:

value
Lorem
ipsum
dolor
sit
amet.

W poniższym przykładzie kolumna ordinal jest włączona przez przekazanie 1 opcjonalnego trzeciego argumentu:

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

Ta instrukcja zwraca następnie następującą tabelę wyników:

value Porządkowych
Lorem 1
ipsum 2
dolor 3
sit 4
amet. 5

Przykłady

A. Podziel ciąg wartości rozdzielanych przecinkami

Przeanalizuj rozdzielaną przecinkami listę wartości i zwróć wszystkie niepuste tokeny:

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

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

STRING_SPLIT Zwraca pusty ciąg, jeśli nie ma nic między separatorem. Warunek RTRIM(value) <> '' usuwa puste tokeny.

B. Dzielenie ciągu wartości rozdzielanych przecinkami w kolumnie

Tabela product zawiera kolumnę z rozdzielaną przecinkami listą tagów pokazanych w poniższym przykładzie:

IdentyfikatorProduktu Name Etykiety
1 Full-Finger Gloves clothing,road,touring,bike
2 LL Headset bike
3 HL Mountain Frame bike,mountain

Następujące zapytanie przekształca każdą listę tagów i łączy je z oryginalnym wierszem:

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

Oto zestaw wyników.

IdentyfikatorProduktu Name Wartość
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

Uwaga / Notatka

Kolejność danych wyjściowych może się różnić, ponieważ kolejność nie jest gwarantowana, aby dopasować kolejność podciągów w ciągu wejściowym.

C. Agregacja według wartości

Użytkownicy muszą utworzyć raport, który pokazuje liczbę produktów na każdy tag, uporządkowany według liczby produktów i aby filtrować tylko tagi z więcej niż dwoma produktami.

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. Wyszukiwanie według wartości tagu

Deweloperzy muszą tworzyć zapytania, które wyszukują artykuły według słów kluczowych. Mogą używać następujących zapytań:

Aby znaleźć produkty z pojedynczym tagiem (odzież):

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

Znajdź produkty z dwoma określonymi tagami (odzież i droga):

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

E. Znajdowanie wierszy według listy wartości

Deweloperzy muszą utworzyć zapytanie, które znajduje artykuły według listy identyfikatorów. Mogą używać następującego zapytania:

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

STRING_SPLIT Poprzednie użycie zastępuje wspólny antywzorzec. Taki antywzorzec może obejmować utworzenie dynamicznego ciągu SQL w warstwie aplikacji lub w języku Transact-SQL. Lub antywzorzec można osiągnąć za pomocą LIKE operatora . Zobacz następującą przykładowe SELECT instrukcje:

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

F. Znajdowanie wierszy według wartości porządkowych

Poniższa instrukcja znajduje wszystkie wiersze z parzystą wartością indeksu:

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

Powyższa instrukcja zwraca następującą tabelę:

value Porządkowych
Teksas 2
Waszyngton 4
Kolorado 6

G. Porządkowaj wiersze według wartości porządkowych

Poniższa instrukcja zwraca podzielone wartości podciągów ciągu wejściowego i ich wartości porządkowe uporządkowane według kolumny ordinal :

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

Powyższa instrukcja zwraca następującą tabelę:

value Porządkowych
A 5
B 4
C 3
D 2
E 1