2011-02-09 6 views
0
다음

는 저장 프로 시저의 일부입니다 - @ID = 0는 다음의 조건을 무시하면 현재케이스를 사용하는 방법 where where conditon tsql?

@ID int 
@Col1 int 
@Col2 int 

Select * 
from Table_01 t1 
JOIN table_02 t2 on t1.col = t2.col 
where 
    1 = case when @Col1 = 0 then 1 else (case when t2.Col1 = @Col1 then 1 else 0 end) end 
    AND 1 = case when @Col2 = 0 then 1 else (case when t2.Col2 = @Col2 then 1 else 0 end) end 
    AND 1 = case when @ID = 0 then 1 else (case when t2.ID = @ID then 1 else 0 end) end 

  • @ID는 다음의 기준을 만족에 따라 결과를 반환 값이있는 경우

거기에 다른 조건을 추가해야합니다. -

(일치가없는 사촌)

if @ID = -1는 있지만 @ID = 0처럼 행동한다는

내가 분명히 있습니까 (expresssion을 추가 무시) 어떤 결과를 반환하지 않겠습니까? :(이 마지막 조건이 비장의 다른 두, 다음 순서를 변경해야하는 경우는

+0

이 마지막 조건이 다른 두 가지보다 우선해야합니까? – Thomas

+0

SQL 서버 2005에서'option (recompile)'을 사용하여도 기억이 안나도 완전히 unsargable입니다. –

답변

0
Select ... 
From Table_01 As t1 
    Join table_02 As t2 
     On t1.col = t2.col 
Where Case 
     When @ID = 0 Then 1 
     When t2.ID = @ID Then 1 
     When @ID = -1 Then 0 
     Else 0 
     End = 1 

이 : 물론

Select ... 
From Table_01 As t1 
    Join table_02 As t2 
     On t1.col = t2.col 
Where Case 
     When @ID = -1 Then 0 
     When @ID = 0 Then 1 
     When @ID = t2.ID Then 1 
     Else 0 
     End = 1 

수행 할 수있는 또 다른 방법을 더 나은 (@ID = -1 가정은 소중) :

Select ... 
From Table_01 As t1 
    Join table_02 As t2 
     On t1.col = t2.col 
Where @ID != -1 
    And (@ID = 0 Or @ID = t2.ID) 

업데이트 영업 이익의 편집에 따라

,369 당신이 그런 짓을하려고하는 것처럼 1,363,210

그것은 소리 다음

Select ... 
From Table_01 As t1 
    Join table_02 As t2 
     On t1.col = t2.col 
Where @ID != -1 
    And (@Col1 = 0 Or @Col1 = t2.Col1) 
    And (@Col2 = 0 Or @Col2 = t2.Col2) 
    And (@ID = 0 Or @ID = t2.ID) 
+0

고마워 .. 약간의 문제가 ... 내 편집 된 질문보기. 나는 하나 이상의 AND condtion을 가지고있다. IF @ID = -1 그러면 나는이 조건이 utlimately this와 같아야한다. t2.Col1 = 5와 t2.Col2 = 1 및 t2.ID = -1 (coz -1에는 일치하지 않음) – User13839404

+0

@Jango - 답변을 업데이트했습니다. Case 표현식을 사용하는 대신 일련의 AND 문만 있으면됩니다. – Thomas

0

나는 그것이 명확 있도록를 작성하려고합니다 :

WHERE @ID IN (0, t2.ID) AND @ID <> -1 

또는

WHERE (@ID = 0 OR t2.ID = @ID) AND @ID <> -1 

T2 경우 .ID는 -1 일 수 없으며 그 부분은 필요하지 않습니다.

0

정확하게 이해하면 @ID = -1@ID = 0과 동일한 효과를 나타내기를 원할 것입니다. 이 경우 쿼리의 모양은 다음과 같습니다.

Select * 
FROM Table_01 t1 
    JOIN table_02 t2 on t1.col = t2.col 
WHERE @Col1 IN (0, t2.Col1) 
    AND @Col2 IN (0, t2.Col2) 
    AND @ID IN (-1, 0, t2.ID)