La meilleure façon de faire une logique d'instruction de requête nestede dans SQL Server

J'écris actuellement une requête SQL, où quelques-unes des colonnes returnnées doivent être calculées en fonction de beaucoup de conditions.

J'utilise actuellement des instructions de cas nestedes, mais celles-ci deviennent désordonnées. Y a-t-il un meilleur moyen (plus organisé et / ou plus lisible)?

(J'utilise Microsoft SQL Server, 2005)


Un exemple simplifié:

SELECT col1, col2, col3, CASE WHEN condition THEN CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation1 ELSE calculation2 END ELSE CASE WHEN condition2 THEN calculation3 ELSE calculation4 END END ELSE CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation5 ELSE calculation6 END ELSE CASE WHEN condition2 THEN calculation7 ELSE calculation8 END END END AS 'calculatedcol1', col4, col5 -- etc FROM table 

Vous pourriez essayer une sorte de tour de COALESCE, par exemple:

 SELECT COALESCE (
   CASE WHEN condition1 ALORS calcul1 ELSE NULL END,
   CASE WHEN condition2 PUIS calcul2 ELSE NULL END,
   etc...
 )

Enveloppez tous ces cas en un seul.


 SELECT col1, col2, col3, CASE WHEN condition1 THEN calculation1 WHEN condition2 THEN calculation2 WHEN condition3 THEN calculation3 WHEN condition4 THEN calculation4 WHEN condition5 THEN calculation5 ELSE NULL END AS 'calculatedcol1', col4, col5 -- etc FROM table 

Vous pouvez combiner plusieurs conditions pour éviter la situation:

 CASE WHEN condition1 = true AND condition2 = true THEN calculation1 WHEN condition1 = true AND condition2 = false ELSE 'what so ever' END, 

Personnellement, je le fais de cette façon, en gardant les expressions CASE incorporées confinées. Je voudrais également append des commentaires pour expliquer ce qui se passe. Si c'est trop complexe, brisez-le en fonction.

 SELECT col1, col2, col3, CASE WHEN condition THEN CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation1 ELSE calculation2 END ELSE CASE WHEN condition2 THEN calculation3 ELSE calculation4 END END ELSE CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation5 ELSE calculation6 END ELSE CASE WHEN condition2 THEN calculation7 ELSE calculation8 END END AS 'calculatedcol1', col4, col5 -- etc FROM table 

une fonction définie par l'user peut mieux server, au less pour cacher la logique – esp. si vous avez besoin de le faire dans plus d'une requête

Nous pouvons combiner plusieurs conditions set pour réduire les frais généraux de performance.

Soit il y a trois variables abc sur lesquelles on veut effectuer des cas. Nous pouvons le faire comme ci-dessous:

 CASE WHEN a = 1 AND b = 1 AND c = 1 THEN '1' WHEN a = 0 AND b = 0 AND c = 1 THEN '0' ELSE '0' END, 

Voici une solution simple à la déclaration de cas "complexe" nestede: – Expression complexe nestede

 select datediff(dd,Invdate,'2009/01/31')+1 as DaysOld, case when datediff(dd,Invdate,'2009/01/31')+1 >150 then 6 else case when datediff(dd,Invdate,'2009/01/31')+1 >120 then 5 else case when datediff(dd,Invdate,'2009/01/31')+1 >90 then 4 else case when datediff(dd,Invdate,'2009/01/31')+1 >60 then 3 else case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 2 else case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 1 end end end end end end as Bucket from rm20090131atb 

Assurez-vous simplement d'avoir une déclaration de fin pour chaque déclaration de cas

Je suis passé par là et j'ai trouvé toutes les réponses super cool, mais veut append à la réponse donnée par @deejers

  SELECT col1, col2, col3, CASE WHEN condition1 THEN calculation1 WHEN condition2 THEN calculation2 WHEN condition3 THEN calculation3 WHEN condition4 THEN calculation4 WHEN condition5 THEN calculation5 END AS 'calculatedcol1', col4, col5 -- etc FROM table 

vous pouvez rendre ELSE facultatif car ce n'est pas obligatoire, il est très utile dans de nombreux scénarios.