Lors de l’écriture de requêtes SQL, il est courant d’utiliser l’expression CASE pour effectuer une logique conditionnelle et renvoyer différentes valeurs en fonction de certaines conditions. Cependant, il existe différentes façons d’écrire une instruction CASE dans SQL Server, et il est important de comprendre les différences entre elles.
Traditionnellement, de nombreux développeurs écrivent leurs instructions CASE en utilisant la logique suivante :
SELECT CASE WHEN @Priority = 1 THEN 'Très élevée' WHEN @Priority = 2 THEN 'Élevée' WHEN @Priority = 3 THEN 'Moyenne' WHEN @Priority = 4 THEN 'Faible' ELSE 'N/A' END
Alors que cette approche fonctionne, il existe une autre syntaxe qui peut être utilisée avec l’expression CASE, que certains trouvent plus esthétique :
SELECT CASE @Priority WHEN 1 THEN 'Très élevée' WHEN 2 THEN 'Élevée' WHEN 3 THEN 'Moyenne' WHEN 4 THEN 'Faible' ELSE 'N/A' END
À première vue, la deuxième approche semble plus propre et plus concise. Cependant, il est important de noter que le comportement des deux expressions CASE est différent.
La première approche, appelée “expression CASE simple”, compare une expression à un ensemble d’expressions simples pour déterminer le résultat. La deuxième approche, appelée “expression CASE recherchée”, évalue un ensemble d’expressions booléennes pour déterminer le résultat. Les deux formats prennent en charge un argument ELSE facultatif.
Pour illustrer la différence, examinons l’évaluation des valeurs NULL à l’aide des deux expressions CASE :
-- Exemple 1 SELECT NomBaseDeDonnées, CASE NomBaseDeDonnées WHEN NULL THEN 'C'est un NULL' WHEN 'SQLUndercover' THEN 'Correspondance trouvée' ELSE 'Aucune correspondance trouvée' END AS ExempleCase1, CASE WHEN NomBaseDeDonnées IS NULL THEN 'C'est un NULL' WHEN NomBaseDeDonnées = 'SQLUndercover' THEN 'Correspondance trouvée' ELSE 'Aucune correspondance trouvée' END AS ExempleCase2 FROM (VALUES(NULL)) AS ListeDérivée (NomBaseDeDonnées) -- Exemple 2 SELECT NomBaseDeDonnées, CASE NomBaseDeDonnées WHEN NULL THEN 'C'est un NULL' WHEN 'SQLUndercover' THEN 'Correspondance trouvée' ELSE 'Aucune correspondance trouvée' END AS ExempleCase1, CASE WHEN NomBaseDeDonnées IS NULL THEN 'C'est un NULL' WHEN NomBaseDeDonnées = 'SQLUndercover' THEN 'Correspondance trouvée' ELSE 'Aucune correspondance trouvée' END AS ExempleCase2 FROM (VALUES('SQLUndercover')) AS ListeDérivée (NomBaseDeDonnées)
Dans l’exemple 1, où la valeur est NULL, les deux expressions CASE produisent des résultats différents. La première expression renvoie incorrectement ‘Aucune correspondance trouvée’ au lieu de ‘C’est un NULL’. La deuxième expression identifie correctement la valeur NULL.
Cependant, dans l’exemple 2, où la valeur n’est pas NULL, les deux expressions CASE produisent les mêmes résultats. Cela peut être trompeur et peut conduire à des données incorrectes si on n’y prend pas garde.
Lors de l’évaluation de NULL dans une expression CASE, il est crucial de choisir le bon type de CASE pour le travail. L’expression CASE simple peut ne pas gérer les valeurs NULL comme prévu, tandis que l’expression CASE recherchée fournit des résultats plus précis.
Il convient de noter que le comportement des expressions CASE peut également être affecté par le paramètre ANSI_NULLS. Lorsque ANSI_NULLS est activé, la comparaison d’égalité de NULL n’est pas autorisée et les résultats peuvent différer. Il est donc toujours recommandé de tester vos requêtes avec différents paramètres pour garantir des résultats précis.
La prochaine fois que vous écrirez une instruction CASE dans SQL Server, soyez attentif aux différentes options de syntaxe et à leurs implications. Choisir le bon type d’expression CASE peut vous éviter des incohérences de données potentielles et garantir des résultats de requête précis.
Merci de votre lecture !