L'instruction SQL Server (2008 ou 2012, en particulier) CASE
évalue-t-elle toutes les WHEN
conditions ou se ferme-t-elle une fois qu'elle trouve une WHEN
clause évaluée à true? Si elle passe par l’ensemble des conditions, cela signifie-t-il que la dernière condition évaluée comme vraie remplace ce que la première condition évaluée comme vraie a fait? Par exemple:
SELECT
CASE
WHEN 1+1 = 2 THEN'YES'
WHEN 1+1 = 3 THEN 'NO'
WHEN 1+1 = 2 THEN 'NO'
END
Le résultat est "OUI" même si la dernière condition à remplir doit être évaluée à "NON". Il semble qu'il se ferme une fois qu'il a trouvé la première condition VRAIE. Quelqu'un peut-il s'il vous plaît confirmer si tel est le cas .
sql-server
t-sql
case
Juan Velez
la source
la source
COALESCE()
traduit dans uneCASE
expression.)Réponses:
• Retourne le result_expression du premier input_expression = when_expression évalué à TRUE .
Référence http://msdn.microsoft.com/en-us/library/ms181765.aspx
C'est le comportement standard de SQL:
Une
CASE
expression est évaluée à la première condition vraie.S'il n'y a pas de vraie condition, la
ELSE
partie est évaluée .S'il n'y a pas de condition vraie ni de
ELSE
pièce, le résultat est évalué àNULL
.la source
SQL Server effectue généralement une évaluation de court-circuit pour les instructions CASE ( SQLFiddle ):
Il existe cependant plusieurs types d'instructions qui, à partir de SQL Server 2012, ne court-circuitent pas correctement. Voir le lien de ypercube dans les commentaires.
Oracle effectue toujours une évaluation de court-circuit . Voir la Référence du langage SQL 11.2 . Ou comparez ce qui suit ( SQLFiddle ):
Ce même test ne peut pas être réalisé avec MySQL car il renvoie NULL pour une division par zéro. ( Violon SQL )
la source
Il semble que MS SQL Server utilise également une évaluation de court-circuit.
Dans le test suivant, j'ai 3 tests. Le premier est toujours vrai, le second échoue sans référencer la table et le troisième échoue uniquement lorsque les données sont prises en compte.
Dans cette exécution particulière, les deux lignes sont renvoyées avec succès. Si je commente le premier QUAND, ou le premier et le second, je reçois des échecs.
la source
Si l'instruction case utilisée dans la
WHERE
condition et la première instruction case quand impliquent l'évaluation des valeurs de colonne de la table et que la première ligne de la table ne satisfait pas cette condition, l'instruction case passera à l'instruction case suivante.la source
En MySQL, la casse est supprimée à la première vraie option. Si vous avez la possibilité de plusieurs valeurs vraies, vous souhaitez placer la réponse préférée plus tôt dans la séquence.
la source