NVL Oracle : syntaxe, exemples et NVL vs COALESCE

Illustration du tutoriel SQL Oracle : Fonction SQL ORACLE – NVL()

La fonction SQL ORACLE NVL remplace une valeur nulle avec une valeur non nulle. NVL prend deux paramètres:

Publicité

🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.

📌 À lire aussi : DECODE Oracle : syntaxe et exemples · COALESCE Oracle

NVL(arg1, arg2)

La fonction NVL retourne arg2 si arg1 est nulle, sinon la fonction retourne arg1. Les paramètres utilisés par NVL peuvent être de tout type de données.

Exemple:

Nous voulons afficher le revenu total des salaries de la table EMPLOYEES (schéma HR), qui ont le prénom qui commence par D:

SELECT
FIRST_NAME PRENOM, LAST_NAME NOM, SALARY SALAIRE, COMMISSION_PCT PRIME,
SALARY + (SALARY * COMMISSION_PCT) REVENU
FROM EMPLOYEES WHERE FIRST_NAME LIKE 'D%';


PRENOM      NOM        SALAIRE   PRIME    REVENU  
----------- ---------- --------- -------- --------
Donald      OConnell   2600                       
Douglas     Grant      2600                       
David       Austin     4800                       
Diana       Lorentz    4200                       
Daniel      Faviet     9000                       
Den         Raphaely   11000                      
David       Bernstein  9500      0,25     11875   
Danielle    Greene     9500      0,15     10925   
David       Lee        6800      0,1      7480   

Vous pouvez voir que le REVENU est nulLe pour ceux qui n’ont pas de prime. Pour afficher les revenus de tout le monde, nous allons utiliser la fonction NVL sur la colonne COMMISSION_PCT pour la mettre à O si elle est nulle. Le résultat de la requête avec NVL est :

SELECT
FIRST_NAME PRENOM, LAST_NAME NOM, SALARY SALAIRE, COMMISSION_PCT PRIME,
SALARY + (SALARY * NVL(COMMISSION_PCT, 0)) REVENU
FROM EMPLOYEES WHERE FIRST_NAME LIKE 'D%';


PRENOM      NOM        SALAIRE   PRIME    REVENU  
----------- ---------- --------- -------- --------
Donald      OConnell   2600               2600    
Douglas     Grant      2600               2600    
David       Austin     4800               4800    
Diana       Lorentz    4200               4200    
Daniel      Faviet     9000               9000    
Den         Raphaely   11000              11000   
David       Bernstein  9500      0,25     11875   
Danielle    Greene     9500      0,15     10925   
David       Lee        6800      0,1      7480

Syntaxe de NVL en SQL Oracle

NVL(expression, valeur_de_remplacement)

NVL prend deux arguments : si expression vaut NULL, Oracle renvoie valeur_de_remplacement ; sinon il renvoie expression. Les deux arguments doivent être de types compatibles, sinon Oracle tente une conversion implicite (source classique de l'erreur ORA-01722).

CasRésultat de NVL(a, b)
a n’est pas NULLa
a est NULLb
a et b sont NULLNULL

Exemples pratiques de NVL

1. Remplacer une commission absente par 0 :

SELECT nom, NVL(commission, 0) AS commission FROM employes;

2. Éviter qu’un calcul devienne NULL. En SQL, toute opération avec NULL renvoie NULL : sans NVL, un salaire total serait vide pour les employés sans prime.

SELECT nom, salaire + NVL(prime, 0) AS remuneration_totale FROM employes;

3. Afficher un texte par défaut :

SELECT nom, NVL(email, 'Non renseigné') AS email FROM clients;

4. NVL sur une date :

SELECT nom, NVL(date_depart, SYSDATE) AS date_reference FROM contrats;

NVL, NVL2 et COALESCE : lequel choisir ?

FonctionUsageExemple
NVLUne seule valeur de repliNVL(prime, 0)
NVL2Deux résultats selon NULL ou nonNVL2(prime, ‘Avec prime’, ‘Sans prime’)
COALESCEPremier non-NULL parmi N valeurs, standard SQLCOALESCE(mobile, fixe, email)

COALESCE est portable (SQL Server, PostgreSQL, MySQL) et évalue ses arguments en court-circuit : préférez-le pour du code multi-SGBD. NVL reste plus lisible et légèrement plus rapide sur deux arguments en Oracle.

Erreurs fréquentes avec NVL

  • Types incompatibles : NVL(salaire, 'aucun') déclenche ORA-01722 (salaire est numérique). Convertissez : NVL(TO_CHAR(salaire), 'aucun').
  • Confondre NULL et chaîne vide : en Oracle, '' est NULL, contrairement à PostgreSQL.
  • NVL dans un WHERE sur colonne indexée : WHERE NVL(statut,'X') = 'X' empêche l’usage de l’index. Préférez WHERE statut IS NULL OR statut = 'X'.

Questions fréquentes

À quoi sert la fonction NVL en Oracle ?

NVL remplace une valeur NULL par une valeur de substitution : NVL(commission, 0) renvoie 0 si la commission est NULL, sinon la commission. C’est l’équivalent Oracle de IFNULL (MySQL) ou ISNULL (SQL Server).

Quelle est la différence entre NVL et COALESCE ?

NVL accepte exactement 2 arguments et les évalue tous les deux. COALESCE accepte N arguments, s’arrête au premier non NULL (évaluation paresseuse) et fait partie de la norme SQL : il est donc portable et souvent plus performant.

Quelle est la différence entre NVL et NVL2 ?

NVL(a, b) renvoie b si a est NULL. NVL2(a, b, c) renvoie b si a n’est PAS NULL, et c si a est NULL — utile pour appliquer deux traitements différents selon la nullité.

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

2 commentaires

  1. A noter que cette fonction ne permet pas, si la requête ne retourne aucune ligne, de générer une ligne par défaut : elle ne joue que sur les colonnes nulles de lignes existantes.

    • Oui tout à fait, cette fonction ne retourne un résultat que si la requête elle même retourne une ou plusieurs lignes.
      Merci pour la précision.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Cours SQL & Oracle — 100% gratuitVoir les cours →