2011-02-09 159 views
0

以下是一个存储过程的一部分: -如何在使用情况下在什么情况下使用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 = 0那么它忽略条件
  • 如果@ID有值,那么它基于标准的满意度返回结果

我需要在那里添加另一个条件: -

if @ID = -1那么应该不返回任何结果(堂妹没有匹配) 但它应该像@ID = 0(忽略添加expresssion)

我是清楚了吗? :(

+0

这最后一个条件是否应该胜过其他两个? – Thomas 2011-02-09 21:21:11

+0

即使使用SQL Server 2005中的“选项(重新编译)”,这也是完全不可讨论的,据我所知。 – 2011-02-09 21:22:25

回答

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

我会尝试写它,所以它是清晰的:

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)