
La fonction SQL ORACLE NVL2 remplace une valeur nulle avec une autre valeur entrée en paramètre. NVL2 prend trois paramètres:
NVL2(arg1, arg2, arg3)
La fonction NVL2 retourne arg3 si arg1 est nulle, sinon la fonction retourne arg2. Les paramètres utilisés par NVL2 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 NVL2 sur la colonne COMMISSION_PCT pour retourner SALARY si elle est nulle, sinon on retourne SALARY * COMMISSION_PCT. Le résultat de la requête avec NVL2 est :
SELECT FIRST_NAME PRENOM, LAST_NAME NOM, SALARY SALAIRE, COMMISSION_PCT PRIME, NVL2(COMMISSION_PCT,SALARY + (SALARY * COMMISSION_PCT), SALARY) 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 NVL2 en SQL Oracle
NVL2(expression, valeur_si_non_null, valeur_si_null)NVL2 prend trois arguments : si expression n'est pas NULL, Oracle renvoie le 2e argument ; si elle est NULL, il renvoie le 3e. C'est un IF NOT NULL THEN ... ELSE ... condensé.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
| Cas | NVL2(a, b, c) |
|---|---|
| a n’est pas NULL | b |
| a est NULL | c |
Exemples pratiques de NVL2
SELECT nom, NVL2(commission, 'Commissionné', 'Fixe') AS type_remuneration
FROM employes;
SELECT nom, NVL2(commission, salaire + commission, salaire) AS total
FROM employes;
SELECT nom, NVL2(email, 'Contactable', 'Sans email') AS statut FROM clients;NVL ou NVL2 : comment choisir
| Besoin | Fonction | Exemple |
|---|---|---|
| Remplacer NULL par une valeur | NVL | NVL(prime, 0) |
| Deux résultats différents selon NULL | NVL2 | NVL2(prime,’Oui’,’Non’) |
| Premier non-NULL parmi plusieurs | COALESCE | COALESCE(mobile, fixe) |
Retenez : NVL(a,b) équivaut à NVL2(a, a, b). NVL2 est utile quand la valeur renvoyée en cas de non-NULL est différente de la colonne testée.
Pièges à connaître
- Types de retour : les 2e et 3e arguments doivent être compatibles, sinon Oracle convertit selon le type du 2e — risque d’ORA-01722.
- NVL2 n’existe qu’en Oracle : en SQL Server ou PostgreSQL, utilisez
CASE WHEN a IS NOT NULL THEN b ELSE c END. - Les trois arguments sont évalués : évitez d’y placer des sous-requêtes coûteuses.

bonjour,
merci pour ces explications !
est ce que vous n’auriez pas oublié le « SALARY + » dans la dernière requête ?
SELECT
FIRST_NAME PRENOM, LAST_NAME NOM, SALARY SALAIRE, COMMISSION_PCT PRIME,
NVL2(COMMISSION_PCT,SALARY + (SALARY * COMMISSION_PCT), SALARY) REVENU
FROM EMPLOYEES WHERE FIRST_NAME LIKE ‘D%’;
cdt.
Bonjour,
Vous avez tout à fait raison. Merci pour la remarque. C’est corrigé maintenant.
Cordialement,