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
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
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
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.
Le problème, c'est que vous n'utilisez pas l'expression "dans", donc vous ne répondez pas vraiment à la question.
@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.
Comment la réponse est "non" ? J'écris CASE
déclarations avec IN
tout le temps... tout comme Martin Smith, à ce qu'il semble.
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.
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.
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 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.