Quel est le souci ?!?
Il faut parfois avoir un petit côté agent secret pour comprendre le code SQL. Cela prend tout son sens avec la bien nommée fonction "decode" fournie généreusement par Oracle.
Que fait cette fonction ?
decode(expression, valeur1, résultat1 [, valeurN, résultatN...] [, résultat par défaut])
Elle compare "expression" à "valeur1" et si ça concorde la fonction renvoie "résultat1". Si cela ne concorde pas "expression" est comparée avec "valeur2", si ça concorde on obtient "résultat2" etc. etc. jusquà renvoyer un éventuel "résultat par défaut"
Cette fonction peut avantageusement être remplacée avec une syntaxe CASE. Le CASE est largement répandu dans les langages de programmation, de script etc. SQL Server, PostgreSQL, Oracle etc. acceptent bien sûr sans problème le CASE donc je vais essayer de vous convaincre dabandonner DECODE, même avec Oracle.
Supposons que vous disposiez dune table t avec une seule colonne x et dans cette table une seule ligne ayant x=3. Que renvoient ces requêtes ?
Bon daccord lavantage du CASE nest pas flagrant. On obtient 2 et, dans les deux cas, cest assez lisible. Sur des exemples simples la syntaxe Oracle nest donc pas trop difficile à décoder. Le problème cest que les habitudes se prennent vite et que vous allez peut-être vouloir lutiliser sur des cas plus compliqués.
Laffaire se corse...
Toujours plus difficile...
Pas convaincu ? A votre tour de jouer. Vous avez toujours votre table t avec sa colonne x. Ecrivez avec la fonction DECODE une requête qui renvoie la chaîne ERREUR si x < 0, OK si x = 0 (le cas le plus fréquent) et WARNING si x > 0. Avec un CASE ça peut donner :
Alors vous avez trouvé ? Je suppose que oui mais cest déjà moins lisible je trouve. Julien ma proposé :
Dans la même veine supposons que vous ayez une table perso (nom varchar(128) , date_naissance timestamp)
Ecrivez, sachant que la majorité en France est fixée à 18 ans, une requête avec DECODE affichant le nom et la chaîne :
Avec PostgreSQL et un CASE je propose :
Alors facile ? Avec Oracle et DECODE on me murmure que ça pourrait donner :
Quelle est la syntaxe la plus claire ? Je ne sais pas pour vous mais je ne suis pas développeur et la syntaxe Oracle commence à devenir difficile à comprendre avec mes moyens limités.
Supposons que vous ayez une table avec les matricules des employés de la boîte et les salaires.
PostgreSQL : perso(matricule integer, salaire double precision)
Oracle : perso(matricule number, salaire number)
Vous apprenez que la Gauche pourrait gagner les élections. Vous allez à présent écrire une requête qui renvoie le matricule de l'employé, son salaire et
Pour cet exemple vous pouvez utiliser une valeur fixe de 1500 pour le SMIC. Je propose avec PostgreSQL :
Vincent me propose cette version avec un DECODE sous Oracle :
Certes la version avec DECODE a moins de lignes mais jaime bien que la requête soit compréhensible à la première lecture. Pour moi lécriture en CASE est la plus claire (attention claire ou pas claire ça ne dispense pas de documenter bien sûr !) Je fixe un plafond bien visible avant de commencer (WITH) et ensuite chaque condition est explicitement examinée. On obtient NORMAL si le salaire est entre le SMIC et ce plafond, ANOMALIE CRITIQUE si le salaire est inférieur au SMIC etc.
Nhésitez pas à donner votre avis sur le forum !
Mise à jour : 25/11/2016