Concatenare stringhe su diverse righe di una tabella

0
(0)

Se hai SQL Server 2017 o superiori, fermati pure: la funzione che cerchi è STRING_AGG. Prego.

 

Se invece stai lavorando ancora con il 2016 (cosa dici? 2014??? 2012??? 2008?????????), vorresti una funzione simile, ma non esiste.

Di seguito, qualche trucchetto per poter fare lo stesso senza la lussuosa STRING_AGG:

1. usare coalesce

Uno dei miei metodi preferiti è COALESCE. Usando la sintassi seguente:

SELECT @VarStringa = COALESCE(@VarStringa + ', ', '') + campostringa FROM tabella

eseguiamo qualcosa di simile a una query ricorsiva (e no, non scriverò come concatenare le stringhe con una query CTE ricorsiva, dal momento che COALESCE è infinitamente più semplice).

La prima volta @VarStringa è NULL, quindi non concatena la prima virgola, (perché NULL + stringa = NULL); dalla seconda iterazione in poi invece il campo è valorizzato, e quindi si concatena anche la virgola.

Il risultato è che se concateniamo, per esempio, descrizioni di pizze, con una query del tipo:

SELECT @pizze = COALESCE(@pizze + ', ', '') + nomepizza FROM pizze

avremo un elenco in cui il numero di virgole è una in meno del numero di elementi:

margherita, capricciosa, diavola

in pratica, non dovremo fare un brutto

SET @pizze = LEFT(@pizze, LEN(@pizze) - 2)

2. usare XML

Questo è proprio un truccaccio, perché XML non è nato per questo.

SELECT STUFF(
    (SELECT ',' + nomepizza FROM pizze FOR XML PATH('')
), 1, 1, '')

STUFF serve proprio ad evitare il LEFT di cui sopra, ma il vero cuore del concatenamento è FOR XML PATH(”).

La conversione in XML porta l’elenco di pizze ad avere un formato del tipo

<row>margherita</row><row>capricciosa</row><row>diavola</row>

perché in mancanza di altre indicazioni FOR XML PATH assegna come tag di riga <row>. Se specificassimo come parametro di PATH anche un nome di tag, per esempio FOR XML PATH(‘Pizza’) il risultato sarebbe:

<pizza>margherita</pizza><pizza>capricciosa</pizza><pizza>diavola</pizza>

se invece non specifichiamo proprio niente, la concatenazione è continua. FOR XML PATH(”) darebbe:

margheritacapricciosadiavola

allora noi ci aggiungiamo la virgola, e poi togliamo la prima dall’inizio con STUFF.

Hai trovato utile questo contenuto?

Valutazione: 0 / 5. Voti: 0

Vota per primo questo contenuto

Ci dispiace che tu abbia trovato inutile o sbagliato questo contenuto

Lasciaci un messaggio

Come possiamo migliorare?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Moderazione dei commenti attiva. Il tuo commento non apparirà immediatamente.