2011-02-09 13 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

この最後の条件は他の2つよりも優先すべきですか? – Thomas

+0

これは、私が覚えている限り、SQL Server 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) 

更新OPの編集に基づいて

次のような何かをしようとしているようですね:

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) 
関連する問題