Оператор CASE IN с несколькими значениями - PullRequest
39 голосов
/ 16 сентября 2011

Есть ли способ сделать оператор CASE с предложением IN?

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

Ответы [ 4 ]

85 голосов
/ 16 сентября 2011

Да.Вам нужно использовать форму «Поиск», а не «Простую» форму выражения CASE

SELECT CASE
         WHEN c.Number IN ( '1121231', '31242323' ) THEN 1
         WHEN c.Number IN ( '234523', '2342423' ) THEN 2
       END AS Test
FROM   tblClient c  
8 голосов
/ 16 сентября 2011

Вы можете вернуть одно и то же значение из нескольких совпадений:

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

Это, вероятно, приведет к тому же плану выполнения, что и предложение Мартинса, так что это скорее вопрос того, как вы хотите его написать.

0 голосов
/ 07 февраля 2019

Вопрос специфичен для SQL Server, но я бы хотел расширить Ответ Мартина Смита .

Стандарт SQL: 2003 позволяет определять несколько значений для простого выражения регистра :

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

Это необязательная функция: Предикаты, разделенные запятыми в простом CASEвыражение «(F263) .

Синтаксис:

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

Что касается того, что я не знаю ни одной СУБД, которая фактически поддерживает этот синтаксис.

0 голосов
/ 18 сентября 2011

Если у вас есть больше номеров или вы собираетесь добавить новые тестовые номера для CASE, тогда вы можете использовать более гибкий подход:

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;

Также вместо табличной переменной вы можете использовать обычную таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...