Je dois modifier certaines requêtes SQL (SQL Server 2005) effectuées par une autre personne et dans ce code je vois souvent la construction suivante:
SELECT fieldA, SUM(CASE fieldB WHEN null THEN 0 ELSE fieldB END) as AliasName FROM ...
Je ne comprends pas la déclaration de cas car pour autant que je sache, null ne peut pas être vérifié dans un cas et donc je pense que le code ci-dessus fait la même chose que:
SELECT fieldA, SUM(fieldB) as AliasName FROM ...
J'ai aussi fait quelques tests et n'ai pas vu de différences dans le résultat. Ai-je oublié quelque chose, ou est-ce que je peux replace la déclaration supérieure par la plus courte?
METTRE À JOUR
Uniquement pour l'exhaustivité car elle n'est pas mentionnée dans les réponses: Le code supérieur renvoie le même résultat que le code inférieur . La construction de case
utilisée ne remplace pas les zéro par zéro et peut donc être ignorée. Si le but du sql d'origine était de s'assurer que jamais null ne sera returnné, le coalesce
ou le isnull
-operator peuvent être utilisés (comme indiqué dans les réponses).
La sortie de votre deuxième instruction contiendra des valeurs nulls
(lors de l'agrégation d'loggings qui n'ont que des valeurs null
pour fieldB
). Si cela ne vous dérange pas, vous allez bien.
Si vous voulez des zéros dans votre sortie plutôt que null
valeurs null
, utilisez ceci:
select fieldA, sum(isnull(fieldB, 0)) as AliasName from ...
Vous obtiendrez cela plus facilement avec
SELECT fieldA, COALESCE(fieldB, 0) as AliasName