J'écris une requête SQL, où quelques-unes des colonnes renvoyées doivent être calculées en fonction de nombreuses conditions.
J'utilise actuellement des instructions de cas imbriquées, mais cela devient compliqué. Existe-t-il une meilleure façon (plus organisée et / ou 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
CASE WHEN
Réponses:
Vous pouvez essayer une sorte d'astuce COALESCE, par exemple:
la source
Enveloppez tous ces étuis en un seul.
la source
Vous pouvez combiner plusieurs conditions pour éviter la situation:
la source
Personnellement, je le fais de cette façon, en gardant les expressions CASE intégrées confinées. Je ferais également des commentaires pour expliquer ce qui se passe. S'il est trop complexe, mettez-le en fonction.
la source
Voici une solution simple à la déclaration de cas "Complexe" imbriquée: - Expression complexe de cas imbriqués
Assurez-vous simplement d'avoir une instruction de fin pour chaque instruction de cas
la source
Nous pouvons combiner plusieurs conditions pour réduire la surcharge de performance.
Soit il y a trois variables abc sur lesquelles nous voulons effectuer des cas. Nous pouvons le faire comme ci-dessous:
la source
une fonction définie par l'utilisateur peut mieux servir, au moins pour masquer la logique - esp. si vous devez le faire dans plus d'une requête
la source
Je suis passé par là et j'ai trouvé toutes les réponses super cool, mais je veux ajouter à la réponse donnée par @deejers
vous pouvez rendre ELSE facultatif car ce n'est pas obligatoire, c'est très utile dans de nombreux scénarios.
la source
Cet exemple peut vous aider, l'image montre à quoi ressemblera l'instruction de cas SQL quand il y a if et plus d'une boucle if interne
la source