2010-12-10 25 views
1

je dois changer certaines requêtes SQL (SQL Server 2005) effectuées par une autre personne et dans ce code, je vois souvent la construction suivante:SQL avec un but inconnu

SELECT fieldA, SUM(CASE fieldB WHEN null THEN 0 ELSE fieldB END) as AliasName FROM ... 

Je ne comprends pas la déclaration de cas parce que pour autant que je sache, nul ne peut être vérifiée 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'ont pas vu de différences dans le résultat. Ai-je oublié quelque chose, ou est-ce que je peux remplacer la déclaration supérieure par la plus courte?

MISE À JOUR

seulement pour être complet, car il est pas mentionné dans les réponses: Le code supérieur renvoie le même résultat que la partie inférieure. La construction case utilisée ne remplace pas les null par les zéros et peut donc être ignorée. Si le but du sql d'origine était de s'assurer que jamais null ne sera retourné, le coalesce ou le isnull -operator peut être utilisé (comme indiqué dans les réponses).

+0

Peut-être qu'ils ne savent pas COALESCE – Bonshington

Répondre

4

La sortie de votre deuxième déclaration contiendra nulls (lors de l'agrégation des enregistrements qui ne ont null valeurs 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, utilisez ceci:

select fieldA, sum(isnull(fieldB, 0)) as AliasName from ... 
+0

Comment va t-il se 'NULL' dans le' SUM'? – JNK

+0

Lorsqu'aucune valeur non nulle n'est agrégée, elle renvoie null. –

+0

+1 J'ai supprimé mon post et voté en vôtre lorsque vous mentionnez les valeurs null dans le jeu de résultats et comment les supprimer. –

1

Vous y parviendrait plus lisiblement avec

SELECT fieldA, COALESCE(fieldB, 0) as AliasName 
+0

Vous voulez dire SUM (COALESCE (fieldB, 0)) comme AliasName, n'est-ce pas? Est-ce plus efficace que sum (isnull (fieldB, 0)) tel qu'il est posté par JeffSternal? – HCL

+0

Oui, bien sûr, désolé. Je n'ai aucune idée si c'est plus efficace, plus une question de style – smirkingman