Fonction SQL ORACLE – NVL2()
La fonction 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
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,