Uso di SELECT per generare una lista separata da virgole
pubblicato il 24/10/2008
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.
Qualche volta però mi è capitato 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 maltolto... 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.
