Использование оператора CASE внутри предложения IN

Можно ли использовать оператор CASE внутри предложения IN?

Это упрощенная версия того, что я пытался правильно скомпилировать:

SELECT * FROM MyTable 
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END )

Спасибо!

Ответы на вопрос(4)

Решение Вопроса

CASE возвращает только скалярное значение. Вы можете сделать это вместо этого. (Я предполагаю, что в соответствии с вашим примером, когда @StatusID = 99, значение StatusID 99 не совпадает.)

from MyTable
where (@StatusID = 99 and StatusID in (5, 11, 13))
    or (@StatusID <> 99 and StatusID = @StatusID)
 RedFilter27 июн. 2012 г., 20:09
@ LittleBobbyTables С вашим именем, я уверен, вы можете изменить это на заднем плане
 crjunk27 июн. 2012 г., 20:21
Благодарность! Отличное решение!

что попробую это по-другому, используя конструктор табличных значений - не разрешены ли TVC в следующем контексте?

SELECT * 
FROM MyTable  
WHERE StatusID IN 
   ( 
   SELECT 
       CASE 
         WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID )
         ELSE @StatusID 
   END  
   ) 

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

SELECT * 
FROM MyTable  
join (values 
      (99,5),(99,11),(99,13),
      (@StatusID , @StatusID)    
    ) t(k,v) on t.k= @StatusID and t.v = StatusID)

или если вам нужно все в предложении where, то:

SELECT * 
FROM MyTable  
WHERE exists (
    select 1
    from (values 
      (99,5),(99,11),(99,13),
      (@StatusID , @StatusID)    
    ) t(k,v)
    where t.k= @StatusID and t.v = StatusID)

No. Вместо этого вы можете положить его снаружи

SELECT *
FROM MyTable
WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1
                WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1
                ELSE 0
           END)

Вы также можете написать это без описания дела.

Другой параметр - это динамический SQL, где вы фактически создаете строку с оператором SQL, а затем выполняете ее. Однако в этом случае динамический SQL выглядит излишним.

 Sung M. Kim15 дек. 2016 г., 15:42
Мне было интересно узнать об этом синтаксисе после прочтения чьей-то инструкции, и теперь я знаю, почему он используется Отличный совет, спасибо, @ gordon-linoff

Ваш ответ на вопрос