Fonction SQL ORACLE – NVL2()

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

La fonction SQL ORACLE NVL2 remplace une valeur nulle avec une autre valeur entrée en paramètre. NVL2 prend trois paramètres:

Publicité
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.

CasNVL2(a, b, c)
a n’est pas NULLb
a est NULLc

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

BesoinFonctionExemple
Remplacer NULL par une valeurNVLNVL(prime, 0)
Deux résultats différents selon NULLNVL2NVL2(prime,’Oui’,’Non’)
Premier non-NULL parmi plusieursCOALESCECOALESCE(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.

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

Laisser un commentaire

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

Publicité