Passa al contenuto

10 funzioni utili da conoscere per aiutarsi a scrivere query in T-SQL

Come semplificare la scrittura delle query con SQL Server

Con l’articolo di oggi vogliamo dare una panoramica su dieci funzioni che risultano essere molti utili in fase di scrittura di query più o meno complesse. Avere una buona panoramica sulle funzionalità messe a disposizione da T-SQL di SQL Server semplifica la vita di sviluppatori e DBA evitando di complicare il testo delle query, user function e stored procedure. 

La lista non vuole essere una classifica ed è stata stilata per così dire a “gusto personale” tra quelle che sono più comuni e/o utili e che ho utilizzato con profitto nella mia carriera lavorativa. 

Brevemente: in SQL Server, una funzione è un oggetto del database che esegue un'operazione e restituisce un valore in base ad input che posso essere tipicamente colonne o espressioni. 

Le funzioni sono utili per evitare codice duplicato e migliorare l'organizzazione delle query oltre ad automatizzare operazioni. 

Iniziamo dunque con la nostra lista! 

ISNULL 

La funzione permette di valutare il contenuto di un campo o espressione e specificare un valore da attribuire di default nel caso la condizione sia verificata ovvero sia NULL. 

ISNULL(check_expression, replacement_value)
  • check_expression: colonna o espressione che potrebbe essere nulla
  • replacement_value: il valore che sostituisce NULL nel caso check_expression lo sia. Il valore fornito deve essere compatibile con il contesto in qui è utilizzato.


Esempio

Possiamo vedere come in qualsiasi colonna sia trovata con il valore NULL venga automaticamente convertita in ‘Anonimo’.

Select ISNULL

Può essere particolarmente utile quando nel caso operazione matematiche il valore NULL va ad invalidare il risultato e i campi NULL tipicamente vengono sostituiti con Zero. 


ISNUMERIC 

Una funzione che controlla se l’espressione fornita in input è un numero. L’espressione ha come risultato 1 se l’espressione è riconosciuta come numero 0 altrimenti. 

ISNUMERIC(expression)
  • expression: colonna o espressione da valutare 

Esempio

SELECT ISNUMERIC('123') AS Result;-- Restituisce 1 (Numero valido)  

SELECT ISNUMERIC('12.34') AS Result;-- Restituisce 1 (Numero decimale valido)  

SELECT ISNUMERIC('ABC') AS Result;-- Restituisce 0 (Non è un numero)  

SELECT ISNUMERIC('$100') AS Result;-- Restituisce 1 (Riconosciuto come valuta)  

SELECT ISNUMERIC('1E5') AS Result;-- Restituisce 1 (Notazione scientifica)  

SELECT ISNUMERIC(NULL) AS Result;-- Restituisce 0 (NULL non è un numero) 

STUFF 

Una funzione che è utile per manipolare stringhe; permette di inserire una stringa in un'altra in una posizione specifica o opzionalmente eliminarne porzioni da quella di partenza. 

STUFF(character_expression, start, length, replace_with_expression)

  • character_expression: la stringa di partenza oggetto di modifica 
  • start: la posizione (con base 1) in cui iniziare la sostituzione/inserimento. 
  • length: il numero di caratteri da rimuovere. 
  • replace_with_expression: la stringa da inserire nella posizione specificata (può essere vuota) 

 Esempio

In questo esempio impostando 7 e 0 indichiamo che a partire dal settimo carattere andiamo ad inserire “ha fatto” sostituendo 0 caratteri nella stringa originale (ovvero inserendo e sovrascrivere nulla). 

STUFF 


TRANSLATE 

Una funzione che sostituisce più caratteri contemporaneamente in una stringa, mappandoli a un altro set di caratteri uno ad uno. 

TRANSLATE(inputString, characters, translations)

  • inputString: la stringa di partenza oggetto di modifica 
  • characters: l’elenco dei simboli oggetto di modifica 
  • translations: l’elenco dei simboli che sostutiscono quelli presente in characters 

Esempio

Come si può notare dall’esempio le occorrenze delle lettere e simboli “a”, “o” e “!” sono state sostituite con il simbolo nello stesso ordine. È importatene sottolineare che i parametri “characters” e “translations” devono contenere lo stesso numero di caratteri. 

 Translate 

 TRANSLATE lo si può vedere come una versione più comoda del REPLACE, evitando di doverne concatenare diversi per ottenere lo stesso risultato! 


COALESCE 

Una funzione che sostituisce il primo valore non NULL da una lista di espressioni. Se tutti i valori della lista sono NULL allora verrà restituito NULL a sua volta; è importate sottolineare che tutti i valori della lista devo essere dello stesso tipo o implicitamente convertibili (compatibili tra loro). 

COALESCE(expression [ , ...n ])

Esempio

COALESCE 

Il primo risultato è Hello in quanto primo valore non NULL fornito dalla lista. 

È particolarmente utile quando si il valore da tornare è disponibile tra più colonne;  immaginiamo di voler restituire almeno una modalità di contatto da una tabella di anagrafiche: 

SELECT Nome
	,COALESCE(Cellulare, TelefonoFisso, Email, 'Nessun contatto') AS PrimoContatto
FROM Clienti;

In questo caso il campo PrimoContatto sarà uno tra i campi in lista (Cellulare, TelefonoFisso e Email) e se tutti sono NULL verrà riportato “Nessun contatto” come  fallback. 

COALESCE  è utilizzabile come versione più flessibile di ISNULL nel caso il campo da valutare non sia uno solo. 

 

REPLICATE 

Una funzione che ripete una stringa un numero specificato di volte, solitamente è utile per generare padding, creare formattazioni specifiche o riempire dati. 

REPLICATE(string_expression, integer_expression)
  • string_expression: la stringa da ripetere 
  • integer_expression: il numero di volte che la stringa deve essere ripetuta
     

 Esempio

Caso banale ma utile a comprendere il funzionamento, la funziona genere una sequenza di cinque #. 

REPLICATE 

In questo invece si utilizza la funzione per ottenere sempre stringhe da 5 caratteri anteponendo tanti zeri ne servono per arrivare a cinque. 

SELECT REPLICATE 

 Può essere utilizzato per mascherare parte di un testo lasciandone visibile solo una parte stile “mascheramento delle carte di credito”. 

Replicate masking


STRING_SPLIT 

Una funzione utilizzata per dividere una stringa in più valori basandosi su un delimitatore specifico (che solitamente possono esser caratteri come virgole, punti e virgole o pipe). 

È utile per trasformare in righe dati compattati in sola stringa e cercare molteplici valori solitamente nelle clausole LIKE. 

STRING_SPLIT(string, separator)

  • string: la stringa da dividere. 
  • separator: il carattere identificato come separatore dei valori contenuti in string 

Il risultato ottenuto da STRING_SPLIT sono in forma tabellare, la colonna che contiene le stringhe divise è automaticamente denominata “value”. Se il separatore fornito non viene trovato la funzione torna una sola riga con la stringa originale. 

Esempio

Come è possibile vedere dall’esempio, la stringa viene automaticamente divisa in tre righe. 

split string 

 Un altro esempio utile è quando si vogliono cercare molteplici valori. Un caso pratico sono le tendine a scelta multipla dove un utente può selezionare più valori a piacimento, tipicamente il risultato di questi componenti è una lista delimitata. 

In questi casi combinando la clausola IN e STRING_SPLIT è possibile filtrare i dati di una tabella ovvero tutte le persone che sono di nome Marco, Antonio e Vera.  clausola in e string split 

STRING_AGG 

Una funzione che permette di concatenare valori di una colonna in un'unica stringa, separandoli con un delimitatore specifico. La possiamo immagine come l’opposto STRING_SPLIT di cui abbiamo appena parlato. 

STRING_AGG(expression, separator)

  • expression: il campo o espressione da utilizzare per concatenare i valori 
  • separator: il\i carattere\i da utilizzare come separatore 

Esempio

select string 

 Molto utile quando vogliamo creare delle liste in base ad un raggruppamento, come nell’esempio qui sotto dove viene prodotta una lista di nomi a partire dal reparto di appartenenza. 

String agg 

 

GENERATE_SERIES

Una funzione che permette di generare una serie di numeri in un intervallo specificato. È molto utile per creare sequenze numeriche senza bisogno di tabelle temporanee o cicli WHILE. Fornendo anche il passo (step) è possibile definire l’incremento o decremento per ogni numero successivo. 

GENERATE_SERIES(start, stop [ , step ])
  • start: il primo numero della serie 
  • stop: l’ultimo numero della serie 
  • step: il passo da tenere nella generazione della serie 

NB: è una funzionalità recente disponibile da SQL Server 2022  (Compatibility level 160)! 

Esempio

In questo esempio si vede l’utilizzo base con la creazione di una serie, così come per STRING_SPLIT il campo generato prende il nome di value (che è possibile rinominare con un alias). 

generate series 

 È possibile utilizzare la funzione anche per creare SET di di esempio concatenando il numero con altro. 

Select generate series 

 Molto interessante è anche la possibilità di creare un set di date sfruttando il numero generato con la funzione DATEADD. 

Dateadd 

 

IIF 

Si tratta di una funzione che permette di inserire in maniera sintetica una struttura di controllo in una query. 

  • boolean_expression: l'espressione che deve essere valuta e deve tornare un valore vero o falso 
  • true_value: cosa tornare se la condizione è soddisfatta 
  • false_value: cosa tornare se la condizione NON è soddisfatta 

Esempio 

 

IIF è molto comoda, rispetto al CASE WHEN THEN, per esempio, per mantenere un codice più compatto e leggibile. Ho voluto inserirla perché noto spesso passa in sordina rispetto al classico CASE. 

 

Considerazioni finali 

Come è intuibile sono presenti molte altre funzioni che non sono state presentate. In questo articolo ci siamo concertati maggiormente su funzioni che manipolano stringhe, ma ne esistono molte altre per gestire numeri e date, ad esempio. 

Con questa carrellata spero di aver dato qualche spunto interessante e vi do appuntamento alla prossima.


di Riccardo Trattenero, pubblicato il 10 marzo 2026 

Multiserver Environment con SQL Server
Come centralizzare e semplificare la gestione di più server SQL