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 nonNULLnella 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.
