복붙노트

[SQL] IN 절 안에 CASE 문을 사용하여

SQL

IN 절 안에 CASE 문을 사용하여

IS는 IN 절 안에 CASE 문을 사용할 수 있습니까?

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

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

감사!

해결법

  1. ==============================

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

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

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

    2.대신 번호, 당신은 외부를 넣을 수 있습니다

    대신 번호, 당신은 외부를 넣을 수 있습니다

    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이 경우 과잉처럼 보인다.

  3. ==============================

    3.나는 테이블 값 생성자를 사용하여 다른이를 시도 할 거라고 생각 - TVC를 다음과 같은 상황에서 허용되지 않습니다?

    나는 테이블 값 생성자를 사용하여 다른이를 시도 할 거라고 생각 - TVC를 다음과 같은 상황에서 허용되지 않습니다?

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

    4.당신의 TVC를 사용하여이 작업을 수행 할 수 있지만 접근 방식은 조금 다르다. 이 케이스를 사용하지 않지만, 선택 가능한 옵션의 숫자가있는 곳은 더 잘 확장 할 수 :

    당신의 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)
    
  5. from https://stackoverflow.com/questions/11232267/using-case-statement-inside-in-clause by cc-by-sa and MIT license