14

我需要在 sql 的 where 子句中使用 if 语句。

Select * from Customer
WHERE  (I.IsClose=@ISClose OR @ISClose is NULL)  
AND    
(C.FirstName like '%'+@ClientName+'%' or @ClientName is NULL )    
AND 
 if (@Value=2)
  begin
  (I.RecurringCharge=@Total  or @Total is NULL )    
  end
 else if(@Value=3)
begin
(I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%' or @Total is NULL )  
end

注意:这不是完整的代码。一切都在 SP 中定义。我只是编写了理解问题所需的代码。

提前致谢。

4

4 回答 4

10
SELECT *
  FROM Customer
 WHERE (I.IsClose=@ISClose OR @ISClose is NULL)  
   AND (C.FirstName like '%'+@ClientName+'%' or @ClientName is NULL )    
   AND (isnull(@Value,1) <> 2
        OR I.RecurringCharge = @Total
        OR @Total is NULL )    
   AND (isnull(@Value,2) <> 3
        OR I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%'
        OR @Total is NULL )

基本上,你的情况是

if (@Value=2)
   TEST FOR => (I.RecurringCharge=@Total  or @Total is NULL )    

翻来覆去,

AND (isnull(@Value,1) <> 2                -- A
        OR I.RecurringCharge = @Total    -- B
        OR @Total is NULL )              -- C

(A)为真时,即@Value为2,无论 B 和 C 结果如何,[A or B or C] 都将变为 TRUE。B 和 C 实际上只在 时检查@Value = 2,这是本意。

于 2012-11-01T06:02:57.117 回答
6

您必须使用CASE 语句/表达式

Select * from Customer
WHERE  (I.IsClose=@ISClose OR @ISClose is NULL)  
AND    
    (C.FirstName like '%'+@ClientName+'%' or @ClientName is NULL )    
AND 
     CASE @Value
         WHEN 2 THEN (CASE I.RecurringCharge WHEN @Total or @Total is NULL) 
         WHEN 3 THEN (CASE WHEN I.RecurringCharge like 
                               '%'+cast(@Total as varchar(50))+'%' 
                     or @Total is NULL )
     END
于 2012-11-01T06:04:12.693 回答
2

Nto确定您使用的是哪个RDBMS,但如果它是SQL Server,您可以查看而不是使用CASE语句

评估条件列表并返回多个可能的结果表达式之一。

CASE 表达式有两种格式:

简单 CASE 表达式将一个表达式与一组简单表达式进行比较以确定结果。

搜索到的 CASE 表达式计算一组布尔表达式以确定结果。

两种格式都支持可选的 ELSE 参数。

于 2012-11-01T06:02:31.303 回答
0
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType)
于 2017-06-14T11:57:26.200 回答