Dela via


STRING_SPLIT (Transact-SQL)

Gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-slutpunkt i Microsoft Fabric Warehouse i Microsoft Fabric

STRING_SPLIT är en tabellvärdesfunktion som delar upp en sträng i rader med delsträngar, baserat på ett angivet avgränsartecken.

Kompatibilitetsnivå 130

STRING_SPLIT kräver att kompatibilitetsnivån är minst 130. När nivån är mindre än 130 kan databasmotorn inte hitta STRING_SPLIT funktionen.

Om du vill ändra kompatibilitetsnivån för en databas läser du Visa eller ändra kompatibilitetsnivån för en databas.

Anmärkning

Kompatibilitetskonfiguration behövs inte för STRING_SPLIT i Azure Synapse Analytics.

Transact-SQL syntaxkonventioner

Syntax

STRING_SPLIT ( string , separator [ , enable_ordinal ] )

Arguments

string

Ett uttryck av valfri teckentyp (till exempel nvarchar, varchar, nchar eller char).

separator

Ett uttryck med ett enda tecken av valfri teckentyp (till exempel nvarchar(1), varchar(1), nchar(1)eller char(1)) som används som avgränsare för sammanfogade delsträngar.

enable_ordinal

Gäller för: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (endast serverlös SQL-pool) och SQL Server 2022 (16.x) och senare versioner

Ett int- eller bituttryck som fungerar som en flagga för att aktivera eller inaktivera utdatakolumnenordinal. Värdet 1 för aktiverar ordinal kolumnen. Om enable_ordinal utelämnas, NULLeller har värdet 0, ordinal inaktiveras kolumnen.

Returtyper

Om utdatakolumnen ordinal inte är aktiverad STRING_SPLIT returnerar en tabell med en kolumn vars rader är delsträngarna. Namnet på kolumnen är value. Den returnerar nvarchar om något av indataargumenten antingen är nvarchar eller nchar. Annars returneras varchar. Längden på returtypen är samma som längden på strängargumentet .

Om argumentet enable_ordinal skickas ett värde av 1returneras en andra kolumn med namnet ordinal som består av de 1-baserade indexvärdena för varje understrängs position i indatasträngen. Returtypen är bigint.

Anmärkningar

STRING_SPLIT matar in en sträng som har avgränsade delsträngar och matar in ett tecken som ska användas som avgränsare eller avgränsare. Om du vill kan funktionen ha stöd för ett tredje argument med värdet 0 eller 1 som inaktiverar respektive aktiverar utdatakolumnen ordinal .

STRING_SPLIT matar ut en tabell med en kolumn eller dubbelkolumn, beroende på argumentet enable_ordinal .

  • Om enable_ordinal är NULL, utelämnas eller har värdet 0, STRING_SPLIT returneras en tabell med en kolumn vars rader innehåller delsträngarna. Namnet på utdatakolumnen är value.

  • Om enable_ordinal har värdet 1returnerar funktionen en tabell med två kolumner, inklusive kolumnen ordinal som består av de 1-baserade indexvärdena för delsträngarna i den ursprungliga indatasträngen.

Argumentet enable_ordinal måste vara ett konstant värde, inte en kolumn eller variabel. Det måste också vara en bit - eller int-datatyp med värdet 0 eller 1. Annars genererar funktionen ett fel.

Utdataraderna kan vara i valfri ordning. Ordningen är inte garanterad att matcha ordningen för delsträngarna i indatasträngen. Du kan åsidosätta den slutliga sorteringsordningen med hjälp av en ORDER BY sats i -instruktionen SELECT , ORDER BY value till exempel eller ORDER BY ordinal.

0x0000 (char(0)) är ett odefinierat tecken i Windows-sortering och kan inte inkluderas i STRING_SPLIT.

Tomma nolllängdsundersträngar finns när indatasträngen innehåller två eller flera efterföljande förekomster av avgränsarens tecken. Tomma delsträngar behandlas på samma sätt som vanliga delsträngar. Du kan filtrera bort alla rader som innehåller den tomma delsträngen WHERE med hjälp av -satsen, till exempel WHERE value <> ''. Om indatasträngen är NULLSTRING_SPLIT returnerar funktionen table-valued en tom tabell.

I följande SELECT instruktion används till exempel blankstegstecknet som avgränsare:

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

I en övningskörning returnerade föregående SELECT resultattabell:

värde
Lorem
ipsum
dolor
sit
amet.

I följande exempel aktiveras ordinal kolumnen genom att skicka 1 för det valfria tredje argumentet:

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

Den här instruktionen returnerar sedan följande resultattabell:

värde Ordinal
Lorem 1
ipsum 2
dolor 3
sit 4
amet. 5

Examples

A. Dela kommaavgränsad värdesträng

Parsa en kommaavgränsad lista med värden och returnera alla icke-tomma token:

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

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

STRING_SPLIT returnerar en tom sträng om det inte finns något mellan avgränsaren. Villkoret RTRIM(value) <> '' tar bort tomma token.

B. Dela kommaavgränsad värdesträng i en kolumn

Produkttabellen har en kolumn med kommaavgränsad lista med taggar som visas i följande exempel:

Produkt-ID Namn Etiketter
1 Full-Finger Gloves clothing,road,touring,bike
2 LL Headset bike
3 HL Mountain Frame bike,mountain

Följande fråga transformerar varje lista med taggar och kopplar dem till den ursprungliga raden:

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

Här är resultatet.

Produkt-ID Namn Värde
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

Anmärkning

Ordningen på utdata kan variera eftersom ordningen inte garanteras matcha ordningen för delsträngarna i indatasträngen.

C. Sammansättning efter värden

Användarna måste skapa en rapport som visar antalet produkter per tagg, sorterade efter antal produkter och för att endast filtrera taggarna med fler än två produkter.

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. Sök efter taggvärde

Utvecklare måste skapa frågor som hittar artiklar efter nyckelord. De kan använda följande frågor:

Så här hittar du produkter med en enda tagg (kläder):

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

Hitta produkter med två angivna taggar (kläder och väg):

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

E. Hitta rader efter lista med värden

Utvecklare måste skapa en fråga som hittar artiklar i en lista med ID:er. De kan använda följande fråga:

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

Föregående STRING_SPLIT användning är en ersättning för ett vanligt antimönster. Ett sådant antimönster kan omfatta skapandet av en dynamisk SQL-sträng i programskiktet eller i Transact-SQL. Eller så kan ett antimönster uppnås med hjälp av operatorn LIKE . Se följande exempelsats SELECT :

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

F. Hitta rader efter ordningsvärden

Följande instruktion hittar alla rader med ett jämnt indexvärde:

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

Ovanstående instruktion returnerar följande tabell:

värde Ordinal
Texas 2
Washington 4
Colorado 6

G. Sortera rader efter ordningsvärden

Följande instruktion returnerar delsträngsvärdena för delsträngen för indatasträngen och deras ordningstal, ordnade efter ordinal kolumnen:

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

Ovanstående instruktion returnerar följande tabell:

värde Ordinal
A 5
B 4
C 3
D 2
E 1