
La fonction DECODE est l’une des fonctions ORACLE les plus utilisées.
La fonction DECODE est équivalente à la commande CASE (JAVA, Shell UNIX etc…). Cette fonction permet de faire des tester comme suit:
si X = C1, alors
retourner R1
sinon si X = C2, alors
retourner R2
sinon si X = C3, alors
retourner R3
…
sinon
retourner D
La syntaxe de DECODE est:
DECODE(X, C1, R1, C2, R2, C3, R3, ..., D)
L’argument D (valeur du dernier sinon), n’est pas obligatoire. Au cas où cet argument n’est pas mentionné, la valeur du dernier sinon est NULL.
Passons aux exemples. Dans la table COUNTRIES (schéma HR), nous voulons afficher le nom du pays et le nom de son continent selon le code REGION_ID:
SELECT COUNTRY_NAME PAYS, DECODE(REGION_ID, 1, 'Europe', 2, 'Amérique', 3, 'Asie', 4, 'Afrique') CONTINENT FROM COUNTRIES; PAYS CONTINENT ------------------------------- ---------------------- Argentina Amérique Australia Asie Belgium Europe Brazil Amérique Canada Amérique Switzerland Europe China Asie Germany Europe Denmark Europe Egypt Afrique France Europe India Asie Italy Europe Japan Asie Kuwait Asie Malaysia Asie Mexico Amérique Nigeria Afrique Netherlands Europe Singapore Asie United Kingdom Europe United States of America Amérique Zambia Afrique Zimbabwe Afrique
Syntaxe de DECODE en SQL Oracle
DECODE(expression, recherche1, resultat1
[, recherche2, resultat2 ...]
[, valeur_par_defaut])DECODE compare expression à chaque valeur recherchée, dans l'ordre, et renvoie le résultat associé à la première correspondance. C'est l'équivalent d'un IF ... THEN ... ELSE directement dans une requête SELECT.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Exemples pratiques de DECODE
1. Traduire un code en libellé :
SELECT nom,
DECODE(statut, 'A', 'Actif',
'I', 'Inactif',
'S', 'Suspendu',
'Inconnu') AS statut_libelle
FROM clients;2. Calcul conditionnel :
SELECT nom, salaire,
DECODE(departement, 'IT', salaire * 1.10,
'RH', salaire * 1.05,
salaire) AS salaire_revalorise
FROM employes;3. Tableau croisé (pivot) — l’usage le plus puissant :
SELECT departement,
SUM(DECODE(sexe, 'M', 1, 0)) AS hommes,
SUM(DECODE(sexe, 'F', 1, 0)) AS femmes
FROM employes
GROUP BY departement;DECODE vs CASE : que choisir ?
| Critère | DECODE | CASE |
|---|---|---|
| Portabilité | Oracle uniquement | Standard SQL (tous SGBD) |
| Comparaison | Égalité stricte seulement | Égalité et conditions (>, <, BETWEEN, LIKE) |
| Gestion de NULL | DECODE considère NULL = NULL | NULL = NULL est faux, il faut IS NULL |
| Lisibilité | Compact | Plus verbeux mais plus clair |
-- même résultat, écrit en CASE
SELECT nom,
CASE statut WHEN 'A' THEN 'Actif'
WHEN 'I' THEN 'Inactif'
ELSE 'Inconnu' END AS statut_libelle
FROM clients;Recommandation : utilisez CASE pour du nouveau code (portable, gère les intervalles), gardez DECODE pour les pivots compacts et la maintenance de code Oracle existant.
Le piège NULL de DECODE
Contrairement à toutes les autres comparaisons SQL, DECODE considère que NULL est égal à NULL. C’est très pratique :
SELECT DECODE(commission, NULL, 'Pas de commission', 'Avec commission') FROM employes;Avec CASE, il faudrait écrire CASE WHEN commission IS NULL THEN ....
Questions fréquentes
Comment fonctionne DECODE en Oracle ?
DECODE compare une expression à des valeurs successives : DECODE(statut, 'A', 'Actif', 'I', 'Inactif', 'Inconnu'). C’est un IF/THEN/ELSE compact, propre à Oracle.
Faut-il utiliser DECODE ou CASE ?
Préférez CASE : il est standard SQL (portable), plus lisible, gère les comparaisons complexes (>, <, BETWEEN, IS NULL) et les conditions multiples. DECODE reste utile pour des correspondances simples valeur→valeur.
DECODE gère-t-il les valeurs NULL ?
Oui, et c’est une particularité : dans DECODE, NULL = NULL est considéré vrai, alors qu’en SQL standard NULL n’est jamais égal à NULL. DECODE(col, NULL, 'vide', 'rempli') fonctionne donc.
Sur le même thème
- Fonction SQL ORACLE – COUNT()
- Fonction SQL ORACLE – MAX()
- Fonction SQL ORACLE – MIN()
- Fonction SQL ORACLE – SUM()
- Fonction SQL ORACLE – AVG()
- Fonction SQL ORACLE – LENGTH()
📌 À lire aussi : La fonction NVL Oracle

Je ne comprends pas la dernière condition « Afrique et Moyen-Orient ». Je ne savais pas que le moyen orient était un continent ?
C’est corrigé maintenant
faut changer le decode aussi sinon c’est faux .. on peut pas avoir juste « Afrique » avec le decode actuel qui indique « Afrique et Moyen-Orient »
Bonjour,
Tout à fait. Merci pour la remarque.
Cordialement,
Bonjour, une petite présentation de la table avec les valeurs de REGION_ID pourrait être appréciable pour la compréhension des plus néophytes 😉
Bonjour, merci pour les explications.
Une petite présentation de la table avec les valeurs de REGION_ID pourrait être appréciable pour les plus néophytes, histoire de bien comprendre la conception du champ CONTINENT. 😉
Pourquoi n’y a-t-il pas l’Océanie ? J’habite en Australie et je me sens discriminé et oppressé par cet oubli.