STRING_SPLIT (Transact-SQL)

Si applica a: sìSQL Server 2016 (13.x) e versioni successive Sìdatabase SQL di Azure SìIstanza gestita di SQL di Azure sìAzure Synapse Analytics

Funzione con valori di tabella che divide una stringa in righe di sottostringhe in base a un carattere separatore specificato.

Livello di compatibilità 130

STRING_SPLIT richiede un livello di compatibilità minimo di 130. Quando il livello è inferiore a 130, SQL Server non riesce a trovare la funzione STRING_SPLIT.

Per modificare il livello di compatibilità di un database, fare riferimento a Visualizzare o modificare il livello di compatibilità di un database.

Nota

La configurazione della compatibilità non è necessaria per STRING_SPLIT in Azure Synapse Analytics.

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

STRING_SPLIT ( string , separator )  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

string
Espressione di qualsiasi tipo carattere, ad esempio nvarchar, varchar, nchar o char.

separator
È un'espressione a carattere singolo di qualsiasi tipo, ad esempio nvarchar(1) , varchar (1) , nchar (1) o char (1) , usata come separatore per sottostringhe concatenate.

Tipi restituiti

Restituisce una tabella a colonna singola le cui righe sono sottostringhe. Il nome della colonna è value. Restituisce nvarchar se uno qualsiasi degli argomenti di input è nvarchar o nchar. In caso contrario, restituisce varchar. La lunghezza del tipo restituito è uguale a quella dell'argomento di stringa.

Osservazioni

STRING_SPLIT inserisce una stringa con sottostringhe delimitate e inserisce un carattere da usare come delimitatore o separatore. STRING_SPLIT restituisce una tabella a colonna singola le cui righe contengono le sottostringhe. Il nome della colonna di output è value.

Le righe di output potrebbero essere in qualsiasi ordine. L'ordine non corrisponde necessariamente all'ordine delle sottostringhe nella stringa di input. È possibile ignorare l'ordinamento finale usando una clausola ORDER BY nell'istruzione SELECT (ORDER BY value).

0x0000 (char(0) ) è un carattere non definito nelle regole di confronto di Windows e non può essere incluso in STRING_SPLIT.

Le sottostringhe vuote di lunghezza zero sono presenti quando la stringa di input contiene due o più occorrenze consecutive del carattere delimitatore. Le sottostringhe vuote vengono trattate allo stesso modo delle sottostringhe semplici. È possibile escludere le righe che contengono la sottostringa vuota usando la clausola WHERE (WHERE value <> ''). Se la stringa di input è NULL, la funzione con valori di tabella STRING_SPLIT restituisce una tabella vuota.

Ad esempio, l'istruzione SELECT seguente usa il carattere spazio come separatore:

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

In un esempio pratico, l'istruzione SELECT precedente ha restituito la tabella dei risultati seguente:

Valore
Lorem
ipsum
dolor
sit
amet.
 

Esempi

R. Dividere una stringa di valori separati da virgola

Analizzare un elenco di valori separati da virgole e restituire tutti i token non vuoti:

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'  
  
SELECT value  
FROM STRING_SPLIT(@tags, ',')  
WHERE RTRIM(value) <> '';

STRING_SPLIT restituirà una stringa vuota se non c'è niente tra i separatori. La condizione RTRIM(value) <> " rimuoverà i token vuoti.

B. Dividere una stringa di valori delimitati da virgola in una colonna

La tabella Product ha una colonna con un elenco di tag delimitati da virgole illustrato nell'esempio seguente:

ProductId Nome Tag
1 Full-Finger Gloves clothing,road,touring,bike
2 LL Headset bike
3 HL Mountain Frame bike, mountain

La query seguente trasforma gli elenchi di tag e li unisce alla riga originale:

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

Questo è il set di risultati.

ProductId Nome Valore
1 Full-Finger Gloves clothing
1 Full-Finger Gloves strada
1 Full-Finger Gloves touring
1 Full-Finger Gloves bike
2 LL Headset bike
3 HL Mountain Frame bike
3 HL Mountain Frame mountain

Nota

L'ordine dell'output può variare poiché non corrisponde necessariamente all'ordine delle sottostringhe nella stringa di input.

C. Aggregazione per valori

Gli utenti devono creare un report che visualizzi il numero di prodotti per ogni tag, ordinati in base al numero di prodotti, e che sia possibile filtrare in base ai tag con più di due prodotti.

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. Ricerca in base al valore del tag

Gli sviluppatori devono creare query per trovare articoli in base a parole chiave. Possono usare le query seguenti:

Per trovare i prodotti con un singolo tag (clothing):

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

Per trovare i prodotti con due tag specificati (clothing e road):

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

E. Trovare le righe in base all'elenco di valori

Gli sviluppatori devono creare una query che consenta di trovare gli articoli in base a un elenco di ID. Possono usare la query seguente:

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

L'uso precedente di STRING_SPLIT è una sostituzione di un anti-pattern comune. Questo anti-pattern può comportare la creazione di una stringa SQL dinamica nel livello dell'applicazione o in Transact-SQL. Oppure, è possibile ottenere un anti-pattern usando l'operatore LIKE. Vedere l'esempio di istruzione SELECT seguente:

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

Vedere anche