2012-06-27 2 views
8

IN 절에서 CASE 문을 사용할 수 있습니까?IN 절에서 CASE 문 사용

이 내가 제대로 컴파일려고 한 무엇의 단순화 된 버전입니다 :

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

감사합니다!

답변

21

CASE은 스칼라 값만 반환합니다. 대신이 작업을 수행 할 수 있습니다. (나는 당신의 예에 따라, @StatusID = 99, 99의 StatusID 값이 일치하지 않을 때 것을, 가정입니다.)

select * 
from MyTable 
where (@StatusID = 99 and StatusID in (5, 11, 13)) 
    or (@StatusID <> 99 and StatusID = @StatusID) 
+1

를 @ LittleBobbyTables 당신의 이름으로, 나는 당신이 백엔드에서 그것을 바꿀 수 있다고 확신합니다. – RedFilter

+0

고마워요! 훌륭한 솔루션! – crjunk

3

번호 대신

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) 
외부를 넣을 수 있습니다

case 문없이이 코드를 작성할 수도 있습니다.

또 다른 옵션은 실제로 SQL 문으로 문자열을 만든 다음 실행하는 동적 SQL입니다. 그러나이 경우 동적 SQL은 과도한 것처럼 보입니다.

+1

다른 사람의 배치 구문을 읽은 후이 구문에 대해 궁금해했는데 이제는 그 구문이 사용 된 이유를 알았습니다. 좋은 팁, 고맙습니다, @ gordon-linoff – Sung

0

나는 이것을 다음과 같은 상황에서 TVC가 허용되지 않는 테이블 밸류 생성자를 사용하여 다르게 시도 할 것이라고 생각했다.

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

TVC를 사용하여이를 수행 할 수 있지만 접근 방식은 조금 다릅니다. 이 케이스를 사용하지 않지만, 가능한 옵션의 수를 선택할 수있다 곳은 더 잘 확장 할 수에서 :

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)