Una lista separata da virgole in una query Sql

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

*