Cos’è NVL / ISNULL (con esempi)

NVL è una funzione per la gestione dei valori NULL che è molto comune in altri dialetti SQL, in particolare in Oracle. In SQL Server, la funzione equivalente e più comune per lo stesso scopo è ISNULL().

Cos’è NVL (e la sua controparte in SQL Server: ISNULL)?

NVL (o ISNULL in SQL Server) è una funzione che ti permette di sostituire un valore NULL con un valore alternativo specificato. È estremamente utile per pulire i dati, per i report o semplicemente per assicurarsi che un’espressione non restituisca NULL quando non è desiderato.

Immagina di avere una colonna che potrebbe contenere dei NULL (es. un campo “Numero di Telefono” opzionale). Quando visualizzi questi dati o li usi in calcoli, un NULL potrebbe causare problemi o semplicemente apparire brutto. NVL (o ISNULL) ti permette di dire: “Se questo valore è NULL, allora usa quest’altro valore invece.”

Sintassi di Base

  • Oracle (e altri database): NVL(espressione_da_controllare, valore_da_sostituire_se_null)
  • SQL Server: ISNULL(espressione_da_controllare, valore_da_sostituire_se_null)

In entrambi i casi, la funzione valuta la espressione_da_controllare. Se questa espressione è NULL, la funzione restituisce il valore_da_sostituire_se_null; altrimenti, restituisce il valore originale dell’espressione_da_controllare.


Esempi Pratici (ISNULL in Azione in SQL Server)

Per rendere tutto più chiaro, userò ISNULL negli esempi, dato che siamo nel contesto di SQL Server.

Esempio 1: Gestire Campi Opzionali per la Visualizzazione

Hai una tabella di clienti dove il campo Email può essere NULL (se non è stato fornito). Vuoi visualizzare “Email non disponibile” invece di NULL.

SQL

-- Dati di esempio
CREATE TABLE Clienti (
    ClienteID INT PRIMARY KEY,
    Nome VARCHAR(50),
    Email VARCHAR(100) NULL
);

INSERT INTO Clienti (ClienteID, Nome, Email) VALUES
(1, 'Alice', 'alice@esempio.com'),
(2, 'Bob', NULL),
(3, 'Charlie', 'charlie@dominio.com');

-- Query con ISNULL
SELECT
    Nome,
    ISNULL(Email, 'Email non disponibile') AS StatoEmail
FROM
    Clienti;

-- Risultato:
-- Nome    StatoEmail
-- ------  --------------------
-- Alice   alice@esempio.com
-- Bob     Email non disponibile
-- Charlie charlie@dominio.com

DROP TABLE Clienti;

Come puoi vedere, ISNULL ha sostituito i NULL nel campo Email con la stringa predefinita.

Esempio 2: Usare ISNULL nei Calcoli

Immagina di avere una tabella con prodotti e un campo Sconto che può essere NULL (se non c’è sconto). Se provi a fare un calcolo aritmetico con un NULL, il risultato sarà NULL. ISNULL può aiutarti.

SQL

-- Dati di esempio
CREATE TABLE Prodotti (
    ProdottoID INT PRIMARY KEY,
    NomeProdotto VARCHAR(50),
    PrezzoUnitario DECIMAL(10, 2),
    Sconto DECIMAL(5, 2) NULL -- Sconto può essere NULL (nessuno sconto)
);

INSERT INTO Prodotti (ProdottoID, NomeProdotto, PrezzoUnitario, Sconto) VALUES
(101, 'Maglietta', 20.00, 0.10), -- 10% di sconto
(102, 'Pantaloni', 50.00, NULL), -- Nessuno sconto
(103, 'Scarpe', 80.00, 0.25); -- 25% di sconto

-- Calcolo del Prezzo Finale senza ISNULL (risultato NULL per i pantaloni)
SELECT
    NomeProdotto,
    PrezzoUnitario,
    Sconto,
    PrezzoUnitario - (PrezzoUnitario * Sconto) AS PrezzoFinaleSenzaISNULL
FROM
    Prodotti;

-- Calcolo del Prezzo Finale con ISNULL (Sconto NULL trattato come 0)
SELECT
    NomeProdotto,
    PrezzoUnitario,
    ISNULL(Sconto, 0.00) AS ScontoEffettivo,
    PrezzoUnitario - (PrezzoUnitario * ISNULL(Sconto, 0.00)) AS PrezzoFinaleConISNULL
FROM
    Prodotti;

-- Risultato con ISNULL:
-- NomeProdotto  PrezzoUnitario  ScontoEffettivo  PrezzoFinaleConISNULL
-- ------------  --------------  ---------------  ---------------------
-- Maglietta     20.00           0.10             18.00
-- Pantaloni     50.00           0.00             50.00
-- Scarpe        80.00           0.25             60.00

DROP TABLE Prodotti;

Nel secondo esempio, usando ISNULL(Sconto, 0.00), ci assicuriamo che se lo Sconto è NULL, venga trattato come 0, permettendo il calcolo del PrezzoFinale per tutti i prodotti.

ISNULL vs. COALESCE: Simili ma Diversi

Mentre ISNULL è la risposta diretta a NVL, in SQL Server esiste un’altra funzione per la gestione dei NULL che è ancora più potente: COALESCE().

  • ISNULL(espressione, valore_sostitutivo): Accetta solo due argomenti e il tipo di dato del risultato è determinato dal tipo di dato della prima espressione. Ha regole di precedence del tipo di dato che possono sorprendere.
  • COALESCE(espressione1, espressione2, ..., espressioneN): Accetta due o più argomenti e restituisce il primo valore non NULL nella lista (leggendo da sinistra a destra). È standard SQL e ha regole di tipo di dato più prevedibili (il tipo del risultato è il tipo di dato con la più alta precedence tra tutte le espressioni).

Quando usare COALESCE? Quando hai più alternative per un valore e vuoi prendere la prima disponibile non NULL.

SQL

-- Esempio con COALESCE: Preferisco l'email, altrimenti il telefono, altrimenti "Nessun contatto"
SELECT
    Nome,
    COALESCE(Email, Telefono, 'Nessun contatto disponibile') AS ContattoPreferito
FROM
    Dipendenti; -- Usiamo la tabella Dipendenti dal tuo esempio precedente sui NULL

Quando senti “NVL SQL”, pensa a:

  • Gestione dei NULL: Sostituire l’assenza di valore con qualcosa di significativo.
  • Oracle: È la funzione tipica di quel database.
  • SQL Server: La sua controparte più diretta è ISNULL().
  • Alternativa più potente: COALESCE() per scenari più complessi o per adesione allo standard SQL.