L’istruzione Select
di Sql permette di ottenere un elenco di elementi sulla base dell’eventuale clausola Where
: per ogni elemento che soddisfa la condizione otterremo una DataRow
del DataTable
; ciò normalmente è soddisfacente per i nostri scopi.
A volte però capita di dover fornire il risultato non sotto forma di DataTable
, ma sotto forma di elenco di elementi separati da virgole: fino a poco tempo fa, la mia soluzione era estrarre il solito DataTable
, scorrere le righe e costruirmi lo stringone finale (magari usando lo StringBuilder
, più performante). Ma poi un giorno ho visto la luce: persino usando puro codice Sql è possibile farsi restituire un’unica stringa contenente gli elementi separati da virgole.
Il trucco si basa sull’uso della funzione Coalesce
all’interno dell’istruzione Select
di estrazione dei dati. La funzione Coalesce
accetta un numero n di argomenti, purché siano tutti dello stesso tipo o di tipi compatibili (cioè convertibili implicitamente tra di loro) restituendo come risultato il primo argomento non nullo. Purtroppo, almeno con la versione 2000 di Sql Server, non è possibile ottenere il risultato con un’unica istruzione, ma occorre scrivere un piccolo script, facendo anche ricorso ad una variabile.
Presento subito lo script, che poi commenterò:
/* Dichiarazione della variabile che conterrà la stringa risultante */ DECLARE @csvstring VarChar(80) /* Potrebbe essere necessario aumentare la dimensione */ /* Istruzione Select di estrazione dei dati */ SELECT @csvstring = Coalesce( @csvstring + ', ','') + CodiceCliente FROM tblClienti WHERE Provincia = 'CO' /* Restituzione del malt... cioè: del risultato! */ SELECT @csvstring
Per ogni riga presente nella tabella, la Select
incrementa il valore della variabile @csvstring
aggiungendogli in fondo una virgola; ed è qui che entra in gioco la funzione Coalesce: se non la usassimo, alla prima riga @csvstring
avrebbe valore NULL
e, siccome anche l’aggiunta di una stringa qualunque ad una stringa NULL
produce risultato NULL
, la variabile @csvstring
resterebbe sempre NULL
. Usando la funzione Coalesce invece, alla prima ricorrenza la stringa NULL
verrebbe sostituita dalla stringa vuota ''
(che è diversa da NULL
!) alla quale potrà essere aggiunta la stringa CodiceCliente
per valorizzare la variabile @csvstring
; dalla seconda ricorrenza in poi la Coalesce
restituirà il valore di @csvstring
(a questo punto non più NULL
) a cui potrà essere aggiunto il CodiceCliente per attribuire il nuovo valore di @csvstring
. L’ultima Select
non fa altro che visualizzare (o restituire se utilizzata all’interno di una function o stored procedure) il valore delle string.