Delen via


STRING_SPLIT (Transact-SQL)

Van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics SQL Analytics-eindpuntin Microsoft FabricWarehouse in Microsoft Fabric

STRING_SPLIT is een tabelwaardefunctie waarmee een tekenreeks wordt gesplitst in rijen met subtekenreeksen, op basis van een opgegeven scheidingsteken.

Compatibiliteitsniveau 130

STRING_SPLIT vereist dat het compatibiliteitsniveau ten minste 130 is. Wanneer het niveau kleiner is dan 130, kan de database-engine de STRING_SPLIT functie niet vinden.

Als u het compatibiliteitsniveau van een database wilt wijzigen, raadpleegt u Het compatibiliteitsniveau van een database weergeven of wijzigen.

Opmerking

Compatibiliteitsconfiguratie is niet nodig voor STRING_SPLIT in Azure Synapse Analytics.

Transact-SQL syntaxis-conventies

Syntaxis

STRING_SPLIT ( string , separator [ , enable_ordinal ] )

Arguments

string

Een expressie van elk tekentype (bijvoorbeeld nvarchar, varchar, nchar of char).

afscheider

Eén tekenexpressie van elk tekentype (bijvoorbeeld nvarchar(1), varchar(1), nchar(1) of char(1)) dat wordt gebruikt als scheidingsteken voor samengevoegde subtekenreeksen.

enable_ordinal

Van toepassing op: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (alleen serverloze SQL-pool) en SQL Server 2022 (16.x) en latere versies

Een int- of bitexpressie die als vlag fungeert om de ordinal uitvoerkolom in of uit te schakelen. Een waarde waarmee 1 de ordinal kolom kan worden ingeschakeld. Als enable_ordinal wordt weggelaten of NULLeen waarde 0heeft, wordt de ordinal kolom uitgeschakeld.

Retourtypen

Als de ordinal uitvoerkolom niet is ingeschakeld, STRING_SPLIT wordt een tabel met één kolom geretourneerd waarvan de rijen de subtekenreeksen zijn. De naam van de kolom is value. Het retourneert nvarchar als een van de invoerargumenten nvarchar of nchar is. Anders wordt varchar geretourneerd. De lengte van het retourtype is hetzelfde als de lengte van het tekenreeksargument .

Als het argument enable_ordinal een waarde 1wordt doorgegeven, wordt een tweede kolom met de naam ordinal geretourneerd die bestaat uit de op 1 gebaseerde indexwaarden van de positie van elke subtekenreeks in de invoertekenreeks. Het retourtype is bigint.

Opmerkingen

STRING_SPLIT een tekenreeks invoert die subtekenreeksen met scheidingstekens heeft en één teken invoert dat moet worden gebruikt als scheidingsteken of scheidingsteken. Optioneel ondersteunt de functie een derde argument met een waarde van 0 of 1 die respectievelijk de ordinal uitvoerkolom uitschakelt of inschakelt.

STRING_SPLIT voert een tabel met één kolom of dubbele kolom uit, afhankelijk van het argument enable_ordinal .

  • Als enable_ordinal is NULL, weggelaten of een waarde 0heeft, STRING_SPLIT wordt een tabel met één kolom geretourneerd waarvan de rijen de subtekenreeksen bevatten. De naam van de uitvoerkolom is value.

  • Als enable_ordinal een waarde 1heeft, retourneert de functie een tabel met twee kolommen, inclusief de ordinal kolom die bestaat uit de op 1 gebaseerde indexwaarden van de subtekenreeksen in de oorspronkelijke invoertekenreeks.

Het argument enable_ordinal moet een constante waarde zijn, niet een kolom of variabele. Het moet ook een bit - of int-gegevenstype met een waarde of 01. Anders genereert de functie een fout.

De uitvoerrijen kunnen in elke volgorde staan. De volgorde komt niet overeen met de volgorde van de subtekenreeksen in de invoertekenreeks. U kunt de uiteindelijke sorteervolgorde overschrijven met behulp van een ORDER BY component in de SELECT instructie, bijvoorbeeld ORDER BY value of ORDER BY ordinal.

0x0000 (char(0)) is een niet-gedefinieerd teken in Windows-sorteringen en kan niet worden opgenomen in STRING_SPLIT.

Lege subtekenreeksen met lengte nul zijn aanwezig wanneer de invoertekenreeks twee of meer opeenvolgende exemplaren van het scheidingsteken bevat. Lege subtekenreeksen worden hetzelfde behandeld als gewone subtekenreeksen. U kunt alle rijen met de lege subtekenreeks uitfilteren met behulp van de WHERE component, bijvoorbeeld WHERE value <> ''. Als de invoertekenreeks is NULL, retourneert de STRING_SPLIT tabelwaardefunctie een lege tabel.

In de volgende SELECT instructie wordt bijvoorbeeld het spatieteken gebruikt als scheidingsteken:

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

In een praktijkuitvoering heeft het voorgaande SELECT de volgende resultaattabel geretourneerd:

waarde
Lorem
ipsum
dolor
sit
amet.

In het volgende voorbeeld wordt de ordinal kolom ingeschakeld door het optionele derde argument door te geven 1 :

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

Met deze instructie wordt vervolgens de volgende resultaattabel geretourneerd:

waarde rangtelwoord
Lorem 1
ipsum 2
dolor 3
sit 4
amet. 5

Voorbeelden

Eén. Tekenreeks met door komma's gescheiden waarden splitsen

Een door komma's gescheiden lijst met waarden parseren en alle niet-lege tokens retourneren:

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

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

STRING_SPLIT retourneert een lege tekenreeks als er niets tussen scheidingstekens is. Met de voorwaarde RTRIM(value) <> '' worden lege tokens verwijderd.

B. Tekenreeks met door komma's gescheiden waarden splitsen in een kolom

De producttabel bevat een kolom met door komma's gescheiden lijst met tags die in het volgende voorbeeld worden weergegeven:

ProductID Naam Tags
1 Full-Finger Gloves clothing,road,touring,bike
2 LL Headset bike
3 HL Mountain Frame bike,mountain

Met de volgende query wordt elke lijst met tags getransformeerd en samengevoegd met de oorspronkelijke rij:

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

Hier is het resultatenoverzicht.

ProductID Naam Waarde
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

Opmerking

De volgorde van de uitvoer kan variëren omdat de volgorde niet overeenkomt met de volgorde van de subtekenreeksen in de invoertekenreeks.

C. Aggregatie op waarden

Gebruikers moeten een rapport maken met het aantal producten per tag, gesorteerd op aantal producten en om alleen de tags met meer dan twee producten te filteren.

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. Zoeken op tagwaarde

Ontwikkelaars moeten query's maken die artikelen zoeken op trefwoorden. Ze kunnen de volgende query's gebruiken:

Producten zoeken met één label (kleding):

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

Producten zoeken met twee opgegeven labels (kleding en weg):

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

E. Rijen zoeken op lijst met waarden

Ontwikkelaars moeten een query maken waarmee artikelen worden gevonden op basis van een lijst met id's. Ze kunnen de volgende query gebruiken:

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

Het voorgaande STRING_SPLIT gebruik is een vervanging voor een veelvoorkomend antipatroon. Een dergelijke antipatroon kan betrekking hebben op het maken van een dynamische SQL-tekenreeks in de toepassingslaag of in Transact-SQL. Of een antipatroon kan worden bereikt met behulp van de LIKE operator. Zie de volgende voorbeeldinstructie SELECT :

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

F. Rijen zoeken op rangtelwaarden

Met de volgende instructie worden alle rijen met een even indexwaarde gevonden:

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

De bovenstaande instructie retourneert de volgende tabel:

waarde rangtelwoord
Texas 2
Washington 4
Colorado 6

G. Rijen ordenen op rangtelwaarden

De volgende instructie retourneert de gesplitste subtekenreekswaarden van de invoertekenreeks en de bijbehorende rangschikkingswaarden, geordend door de ordinal kolom:

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

De bovenstaande instructie retourneert de volgende tabel:

waarde rangtelwoord
A 5
B 4
C 3
D 2
E 1