복붙노트

[SQL] WHERE IN 절에서 SQL 사용 CASE 문

SQL

WHERE IN 절에서 SQL 사용 CASE 문

이 where 절에서의 사건을 사용할 수 있습니까? 이 같은:

 DECLARE @Status VARCHAR(50);
 SET @Status='published';

 SELECT * FROM Product P    
 WHERE P.Status IN (CASE WHEN @Status='published' THEN (1,3)
                                   WHEN @Status='standby' THEN (2,5,9,6)
                                   WHEN @Status='deleted' THEN (4,5,8,10)
                                   ELSE (1,3)
                                   END)

이 코드는 오류가 있습니다 : 근처의 구문이 잘못되었습니다 ','.

해결법

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

    1.아니 당신은 다음과 같은 경우를 사용하고있는 수 없습니다. 하지만 당신은 할 수있다

    아니 당신은 다음과 같은 경우를 사용하고있는 수 없습니다. 하지만 당신은 할 수있다

    SELECT * FROM Product P    
    WHERE @Status='published' and P.Status IN (1,3)
    or @Status='standby' and P.Status IN  (2,5,9,6)
    or @Status='deleted' and P.Status IN (4,5,8,10)
    or P.Status IN (1,3)
    

    BTW 당신은에 그것을 줄일 수 있습니다

    SELECT * FROM Product P    
    WHERE @Status='standby' and P.Status IN (2,5,9,6)
    or @Status='deleted' and P.Status IN (4,5,8,10)
    or P.Status IN (1,3)
    

    이후 또는 P.Status IN이 (1,3)도 @ 상태의 모든 기록을 제공합니다 = '출판'과 P.Status IN (1,3)

  2. ==============================

    2.나는이 대답했습니다 실현,하지만 약간의 문제는 인정 솔루션이있다. 그것은 잘못된 반응을 반환합니다. 쉽게 고칠 수 :

    나는이 대답했습니다 실현,하지만 약간의 문제는 인정 솔루션이있다. 그것은 잘못된 반응을 반환합니다. 쉽게 고칠 수 :

    SELECT * FROM Products P    
    WHERE (@Status='published' and P.Status IN (1,3))
       or (@Status='standby' and P.Status IN  (2,5,9,6))
       or (@Status='deleted' and P.Status IN (4,5,8,10))
       or (@Status not in ('published','standby','deleted') and P.Status IN (1,2))
    

    괄호 (내가 그들을 포함 이유 때문에 읽을 아마도 쉽게 있지만) 필요하지 않습니다.

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

    3.여기 내가 그것을 어떻게, 당신은 where 절에 case 문을 사용할 수 있다고 생각합니다 :

    여기 내가 그것을 어떻게, 당신은 where 절에 case 문을 사용할 수 있다고 생각합니다 :

    Select 
    ProductID
    OrderNo,
    OrderType,
    OrderLineNo
    From Order_Detail
    Where ProductID in (
    Select Case when (@Varibale1 != '') 
    then (Select ProductID from Product P Where .......)
    Else (Select ProductID from Product)
    End as ProductID
    )
    

    이 방법은 나를 다시 시간과 근무하고있다. 시도 해봐!

  4. ==============================

    4.

     select  * from Tran_LibraryBooksTrans LBT  left join
     Tran_LibraryIssuedBooks LIB ON   case WHEN LBT.IssuedTo='SN' AND
     LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when LBT.IssuedTo='SM'
     AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 WHEN
     LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1
     ELSE 0 END`enter code here`select  * from Tran_LibraryBooksTrans LBT 
     left join Tran_LibraryIssuedBooks LIB ON   case WHEN LBT.IssuedTo='SN'
     AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when
     LBT.IssuedTo='SM' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1
     WHEN LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN
     1 ELSE 0 END
    
  5. ==============================

    5.어쩌면 당신은이 방법을 시도 할 수 있습니다

    어쩌면 당신은이 방법을 시도 할 수 있습니다

    고르다 * 제품 P FROM WHERE (CASE 언제 @status = THEN '공개' (케이스 WHEN THEN P.Status IN (1, 3) '진실' 그밖에 그릇된 종료) WHEN @status = THEN '대기' (케이스 WHEN P.Status IN (2, 5, 9, 6) THEN '진실' 그밖에 '그릇된' 종료) 언제 @status가 = THEN '삭제' (케이스 WHEN P.Status IN (4, 5, 8, 10) THEN '진실' 그밖에 '그릇된' 종료) 그밖에 (케이스 WHEN THEN P.Status IN (1, 3) '진실' 그밖에 '그릇된' 종료) END) = 'TRUE'

    @status가 = '출판'경우 이러한 방법으로, 쿼리 P.Status 1 또는 3 중 하나입니다 경우는 TRUE 다른 'FALSE'를 반환합니다 확인합니다. 이 말에 TRUE와 일치합니다

    희망이 도움이.

  6. ==============================

    6.

     SELECT  * FROM Tran_LibraryBooksTrans LBT  
     LEFT JOIN Tran_LibraryIssuedBooks LIB ON 
     CASE WHEN LBT.IssuedTo='SN' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1
          WHEN LBT.IssuedTo='SM' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 
          WHEN LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1
     ELSE 0 END
    
  7. from https://stackoverflow.com/questions/19271853/sql-use-case-statement-in-where-in-clause by cc-by-sa and MIT license