web-dev-qa-db-fra.com

Expression SQL CASE - Définition des valeurs des variables locales

J'ai du code T-SQL utilisant plusieurs instructions if (environ 100) comme ci-dessous. Si la première condition de l'instruction IF est évaluée à TRUE, elle évalue toujours le reste des 99 instructions.

IF(@check = 'abc') SET @var1 = @value
IF(@check = 'def') SET @var2 = @value
IF(@check = 'ghi') SET @var3 = @value
IF(@check = 'jkl') SET @var4 = @value
IF(@check = 'mno') SET @var5 = @value
…
…

Je veux les convertir pour utiliser une expression CASE. par exemple

CASE @check
    WHEN 'abc' THEN SET @var1 = @value
    WHEN 'def' THEN SET @var2 = @value
    WHEN 'ghi' THEN SET @var3 = @value
    WHEN 'jkl' THEN SET @var4 = @value
    WHEN 'mno' THEN SET @var5 = @value
    …
    …
END

Cependant, je ne suis pas en mesure de le faire et j'obtiens une erreur SQL qui indique que je ne peux pas utiliser SET dans une expression CASE.

Quelqu'un at-il des idées sur la façon dont je peux y parvenir? Merci!

8
user2867911

Une déclaration de cas ne suffira pas: la seule façon d'utiliser SET avec CASE est de faire:

SET @var = CASE @check
       WHEN 'abc' THEN @value
       [etc]
    END

... qui ne fonctionnera pas pour vous car cela ne peut définir qu'une seule variable. Vous devez donc utiliser ELSE, c'est-à-dire:

IF (@check = 'abc') SET @var1 = @value
ELSE IF (@check = 'def') SET @var2 = @value
ELSE IF (@check = 'ghi') SET @var3 = @value
ELSE IF (@check = 'jkl') SET @var4 = @value
ELSE IF (@check = 'mno') SET @var5 = @value
   [...]

Cependant, si vous avez 100 clauses comme celle-ci définissant 100 variables différentes, il semble que votre approche puisse être erronée: je prendrais du recul et me demander pourquoi vous avez besoin de 100 variables distinctes. Il y a peut-être quelque chose de mieux que vous pouvez faire en tant que solution basée sur un ensemble, soit la lecture à partir de tables principales ou temporaires. Cependant, nous aurions besoin de plus de détails sur ce que vous essayez de faire (avec un petit exemple, mais pleinement fonctionnel).

23
Chris J

En tant que modification de la réponse de Chris J. Quiconque ici cherche à définir PLUSIEURS paramètres dans un seul if, else if ou else - utilisez la syntaxe suivante:

IF (@check = 'abc') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
ELSE IF (@check = 'def') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
ELSE IF (@check = 'ghi') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
ELSE IF (@check = 'jkl') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
 ELSE IF (@check = 'mno') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end

Notez l'utilisation des instructions "begin" et "end". Ces mots clés sont analogues aux accolades que l'on trouve dans la plupart des langages de programmation et permettent de spécifier plusieurs lignes dans une instruction donnée.

3
robopim