Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: SQL Server 2016 (13.x) a novější verze
koncového bodu Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
v Microsoft Fabric
Warehouse v databázi Microsoft Fabric
SQL 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.
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 je
NULLenable_ordinal vynechána nebo má hodnotu0,STRING_SPLITvrátí tabulku s jedním sloupcem, jejíž řádky obsahují podřetěžce. Název výstupního sloupce jevalue.Pokud enable_ordinal má hodnotu
1, vrátí funkce tabulku se dvěma sloupci, včetněordinalsloupce, 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 |
Související obsah
- VLEVO (Transact-SQL)
- LTRIM (Transact-SQL)
- VPRAVO (Transact-SQL)
- RTRIM (Transact-SQL)
- PODřetěžce (Transact-SQL)
- TRIM (Transact-SQL)
-
řetězcové funkce (Transact-SQL)