Instruction CASE dans une procédure stockée avec MySQL
Dans ce tutoriel nous allons découvrir comment utiliser l’instruction CASE pour construire des instructions conditionnelles complexes dans des procédures stockées. En MySQL, l’instruction CASE a les mêmes fonctionnalités que l’instruction IF-THEN-ELSE et a deux syntaxes que nous allons découvrir dans ce tutoriel.
Notez que si vous souhaitez ajouter la logique if-else à une instruction SQL, vous utilisez l’expression CASE, qui est différente de l’instruction CASE décrite dans ce tutoriel.
Syntaxe 1:
CASE valeur WHEN valeur1 THEN instruction1 WHEN valeur2 THEN instruction2 … [ELSE instruction3] END
Dans cette syntaxe, CASE fait correspondre la valeur avec les valeurs « valeur1 », « valeur2 », etc., et renvoie l’instruction correspondant. Si la valeur n’est égale à aucune valeurs CASE renvoie l’instruction dans la clause ELSE si la clause ELSE est spécifiée.
Exemple:
DELIMITER $ CREATE PROCEDURE getDateLivraison( IN clientID INT, OUT dateLivraison Date ) BEGIN DECLARE pays_client VARCHAR(20); SELECT pays INTO pays_client FROM client WHERE id = clientID; CASE pays_client WHEN 'France' THEN SET dateLivraison = '01/12/2020'; WHEN 'Allemagne' THEN SET dateLivraison = '15/05/2020'; ELSE SET dateLivraison = '00/00/0000'; END CASE; END$ DELIMITER ;
Syntaxe 2:
CASE WHEN condition1 THEN instruction1 WHEN condition2 THEN instruction2 … [ELSE instruction3] END
Dans cette syntaxe, CASE évalue les conditions spécifiées dans les clauses WHEN. Si une condition est évaluée à true. CASE renvoie l’instruction correspondant dans la clause THEN. Sinon, l’instruction spécifié dans la clause ELSE est renvoyé. Si la clause ELSE n’existe pas, l’expression CASE renvoie NULL.
Exemple:
DELIMITER $ CREATE PROCEDURE getDateLivraison( IN clientID INT, OUT dateLivraison Date ) BEGIN DECLARE nbrProduit INT DEFAULT 0; SELECT COUNT(produit) INTO nbrProduit FROM client cl JOIN commande cm ON cl.id = cm.id; CASE pays_client WHEN nbrProduit = 10 THEN SET dateLivraison = '01/12/2020'; WHEN nbrProduit > 50 THEN SET dateLivraison = '15/05/2020'; ELSE SET dateLivraison = '00/00/0000'; END CASE; END$ DELIMITER ;