57 votes

Instruction CASE IN avec plusieurs valeurs

Existe-t-il un moyen de créer une instruction CASE avec une clause IN ?

SELECT
CASE c.Number
IN ('1121231','31242323') THEN 1
IN ('234523','2342423') THEN 2
END AS Test
FROM tblClient c

120voto

Martin Smith Points 174101

Oui. Vous devez utiliser le formulaire "Recherché" plutôt que le formulaire "Simple" de l'outil de recherche de l CASE expression

SELECT CASE
         WHEN c.Number IN ( '1121231', '31242323' ) THEN 1
         WHEN c.Number IN ( '234523', '2342423' ) THEN 2
       END AS Test
FROM   tblClient c

14voto

Guffa Points 308133

Vous pouvez renvoyer la même valeur à partir de plusieurs correspondances :

SELECT
  CASE c.Number
    WHEN '1121231' THEN 1
    WHEN '31242323' THEN 1
    WHEN '234523' THEN 2
    WHEN '2342423' THEN 2
  END AS Test
FROM tblClient c

Cela aboutira probablement au même plan d'exécution que la suggestion de Martin, donc c'est plus une question de comment vous voulez l'écrire.

1 votes

Le problème, c'est que vous n'utilisez pas l'expression "dans", donc vous ne répondez pas vraiment à la question.

4 votes

@t-clausen.dk : Si vous voulez seulement répondre à la question exactement comme elle est posée, la seule réponse possible est "Non", et ce n'est pas très constructif.

1 votes

Comment la réponse est "non" ? J'écris CASE déclarations avec IN tout le temps... tout comme Martin Smith, à ce qu'il semble.

3voto

lad2025 Points 38168

La question est spécifique à SQL Server, mais j'aimerais étendre le champ d'application de cette norme. La réponse de Martin Smith .

La norme SQL:2003 permet de définir plusieurs valeurs pour expression de cas simple :

SELECT CASE c.Number
          WHEN '1121231','31242323' THEN 1
          WHEN '234523','2342423' THEN 2
       END AS Test
FROM tblClient c;

Il s'agit d'une fonction facultative : Prédicats séparés par des virgules dans une expression CASE simple" (F263) .

Syntaxe :

CASE <common operand>
     WHEN <expression>[, <expression> ...] THEN <result>
    [WHEN <expression>[, <expression> ...] THEN <result>
     ...]
    [ELSE <result>]
END

Pour l'instant, je ne connais pas de SGBDR qui supporte cette syntaxe.

2 votes

Je viens d'essayer ceci dans Sql 2012, et si cela a fonctionné à un moment donné, cela ne semble plus être le cas. Ce qui est triste. C'est une syntaxe beaucoup plus claire. Ah bon... Celle de Martin Smith semble fonctionner correctement.

0 votes

@eidylon J'ai déclaré que cette syntaxe fait partie de la norme SQL. Elle est optionnelle et personnellement je ne connais aucun SGBDR qui l'implémente.

-1voto

Bogdan Sahlean Points 10857

Si vous avez plus de numéros ou si vous avez l'intention d'ajouter de nouveaux numéros de test pour CASE alors vous pouvez utiliser une approche plus flexible :

DECLARE @Numbers TABLE
(
    Number VARCHAR(50) PRIMARY KEY
    ,Class TINYINT NOT NULL
);
INSERT @Numbers
VALUES ('1121231',1);
INSERT @Numbers
VALUES ('31242323',1);
INSERT @Numbers
VALUES ('234523',2);
INSERT @Numbers
VALUES ('2342423',2);

SELECT c.*, n.Class
FROM   tblClient c  
LEFT OUTER JOIN   @Numbers n ON c.Number = n.Number;

De même, au lieu d'une variable de tableau, vous pouvez utiliser un tableau ordinaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X