Sdílet prostřednictvím


STRING_SPLIT (Transact-SQL)

Platí pro: SQL Server 2016 (13.x) a novější verze koncového bodu Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticsv Microsoft FabricWarehouse v databázi Microsoft FabricSQL v Microsoft Fabric

STRING_SPLIT je funkce s hodnotou tabulky, která rozdělí řetězec na řádky podřetězců na základě zadaného znaku oddělovače.

Úroveň kompatibility 130

STRING_SPLIT vyžaduje úroveň kompatibility minimálně 130. Pokud je úroveň menší než 130, databázový stroj nemůže najít STRING_SPLIT funkci.

Pokud chcete změnit úroveň kompatibility databáze, přečtěte si článek Zobrazení nebo změna úrovně kompatibility databáze.

Poznámka:

V Azure Synapse Analytics není potřeba STRING_SPLIT konfigurace kompatibility.

Transact-SQL konvence syntaxe

Syntaxe

STRING_SPLIT ( string , separator [ , enable_ordinal ] )

Arguments

string

Výraz libovolného typu znaku (například nvarchar, varchar, nchar nebo char).

oddělovač

Výraz jednoho znaku libovolného typu znaku (například nvarchar(1), varchar(1), nchar(1) nebo char(1)), který se používá jako oddělovač pro zřetězení podřetězců.

enable_ordinal

Platí pro: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (jenom bezserverový fond SQL) a SQL Server 2022 (16.x) a novější verze

Int nebo bitovývýraz, který slouží jako příznak pro povolení nebo zakázání výstupního ordinal sloupce. Hodnota 1 povolí ordinal sloupec. Pokud enable_ordinal vynecháte nebo NULLmá hodnotu 0, ordinal sloupec je zakázaný.

Návratové typy

ordinal Pokud výstupní sloupec není povolený, vrátí tabulku s jedním sloupcem, STRING_SPLIT jejíž řádky jsou podřetěží. Název sloupce je value. Vrátí nvarchar , pokud některý ze vstupních argumentů je nvarchar nebo nchar. V opačném případě vrátí varchar. Délka návratového typu je stejná jako délka řetězcového argumentu.

Pokud je argument enable_ordinal předán hodnotu 1, vrátí se druhý pojmenovaný ordinal sloupec, který se skládá z 1 hodnot indexu pozice každého podřetězce ve vstupním řetězci. Návratový typ je bigint.

Poznámky

STRING_SPLIT zadá řetězec, který obsahuje podřetězce a vstupy o jeden znak, který se použije jako oddělovač nebo oddělovač. Volitelně funkce podporuje třetí argument s hodnotou 0 nebo 1 která zakáže nebo povolí ordinal výstupní sloupec.

STRING_SPLIT v závislosti na argumentu enable_ordinal výstupem tabulky s jedním sloupcem nebo dvojitým sloupcem.

  • Pokud jeNULLenable_ordinal vynechána nebo má hodnotu 0, STRING_SPLIT vrátí tabulku s jedním sloupcem, jejíž řádky obsahují podřetěžce. Název výstupního sloupce je value.

  • Pokud enable_ordinal má hodnotu 1, vrátí funkce tabulku se dvěma sloupci, včetně ordinal sloupce, který se skládá z 1 hodnot indexu podřetězců v původním vstupním řetězci.

Argument enable_ordinal musí být konstantní hodnota, nikoli sloupec nebo proměnná. Musí být také bit nebo int datový typ s hodnotou 0 nebo 1. V opačném případě funkce vyvolá chybu.

Výstupní řádky můžou být v libovolném pořadí. Pořadí není zaručeno, že odpovídá pořadí podřetězců ve vstupním řetězci. Konečné pořadí řazení můžete přepsat pomocí ORDER BY klauzule v SELECT příkazu, ORDER BY value například .ORDER BY ordinal

0x0000 (char(0)) je nedefinovaný znak v kolacích Systému Windows a nelze jej zahrnout do STRING_SPLIT.

Prázdné podřetězce nulové délky jsou přítomné, pokud vstupní řetězec obsahuje dva nebo více po sobě jdoucích výskytů znaku oddělovače. Prázdné podřetětěce se považují za stejné jako prosté podřetětěce. Pomocí klauzule můžete vyfiltrovat všechny řádky, které obsahují prázdný podřetětěr WHERE , například WHERE value <> ''. Pokud je NULLvstupní řetězec , STRING_SPLIT vrátí funkce s hodnotou tabulky prázdnou tabulku.

Například následující SELECT příkaz jako oddělovač používá znak mezery:

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

V praktickém spuštění se předchozí vrácená SELECT tabulka výsledků vrátila:

value
Lorem
ipsum
dolor
sit
amet.

Následující příklad umožňuje ordinal sloupec předáním 1 volitelného třetího argumentu:

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

Tento příkaz pak vrátí následující výslednou tabulku:

value pořadový
Lorem 1
ipsum 2
dolor 3
sit 4
amet. 5

Examples

A. Rozdělení řetězce hodnot oddělených čárkami

Parsujte seznam hodnot oddělených čárkami a vraťte všechny neprázdné tokeny:

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

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

STRING_SPLIT vrátí prázdný řetězec, pokud mezi oddělovačem není nic. Podmínka RTRIM(value) <> '' odebere prázdné tokeny.

B. Rozdělení řetězce hodnot oddělených čárkami ve sloupci

Tabulka produktů obsahuje sloupec se seznamem značek oddělených čárkami zobrazenými v následujícím příkladu:

ID produktu Název Štítky
1 Full-Finger Gloves clothing,road,touring,bike
2 LL Headset bike
3 HL Mountain Frame bike,mountain

Následující dotaz transformuje každý seznam značek a spojí je s původním řádkem:

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

Tady je soubor výsledků.

ID produktu Název Hodnota
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

Poznámka:

Pořadí výstupu se může lišit, protože pořadí není zaručeno, že odpovídá pořadí podřetězců ve vstupním řetězci.

C. Agregace podle hodnot

Uživatelé musí vytvořit sestavu, která zobrazuje počet produktů na každou značku, seřazené podle počtu produktů a filtrovat jenom značky s více než dvěma produkty.

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. Hledat podle hodnoty značky

Vývojáři musí vytvářet dotazy, které hledají články podle klíčových slov. Můžou používat následující dotazy:

Vyhledání produktů s jednou značkou (oblečení):

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

Najděte produkty se dvěma zadanými značkami (oblečení a cesta):

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

E. Vyhledání řádků podle seznamu hodnot

Vývojáři musí vytvořit dotaz, který najde články podle seznamu ID. Můžou použít následující dotaz:

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

Předchozí STRING_SPLIT použití je náhradou za společný antipattern. Takový antipattern může zahrnovat vytvoření dynamického řetězce SQL ve vrstvě aplikace nebo v jazyce Transact-SQL. Nebo antipattern lze dosáhnout pomocí operátoru LIKE . Podívejte se na následující příklad SELECT příkazu:

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

F. Vyhledání řádků podle řadových hodnot

Následující příkaz najde všechny řádky s sudou hodnotou indexu:

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

Výše uvedený příkaz vrátí následující tabulku:

value pořadový
Texas 2
Washington 4
Colorado 6

G. Pořadí řádků podle řadových hodnot

Následující příkaz vrátí hodnoty rozděleného podřetězce vstupního řetězce a jejich řadové hodnoty seřazené podle ordinal sloupce:

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

Výše uvedený příkaz vrátí následující tabulku:

value pořadový
A 5
B 4
C 3
D 2
E 1