2012-11-01 130 views
15

我需要在sql中的where子句中使用if语句。如何在SQL中的Where子句中使用If语句?

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

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

在此先感谢。

回答

6

你必须使用CASE Statement/Expression

Select * from Customer 
WHERE ([email protected] OR @ISClose is NULL) 
AND  
    (C.FirstName like '%'[email protected]+'%' 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 
+0

我尝试相同的,但我给了我的错误“附近有语法错误‘=’”上这条线 当1然后([email protected]或@Total为NULL) –

+0

是的,它是在相同的位置给错误。我已经在我的原始SP中执行它。 –

+0

无法理解“=”附近的错误。 顺便说一句谢谢。 –

2

NTO确保其RDBMS你正在使用,但如果它是SQL服务器,你可以看看,而使用CASE statement

评价了条件列表并返回多个可能 结果的表现之一。

的情况下表达有两种格式:

简单情况下表达的表达与一组简单 表达式来确定结果。

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

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

+0

我使用SQL Server –

+0

然后,而看一个使用CASE语句 –

9
SELECT * 
    FROM Customer 
WHERE ([email protected] OR @ISClose is NULL) 
    AND (C.FirstName like '%'[email protected]+'%' 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 => ([email protected] or @Total is NULL)  

翻转各处,

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

(A)是真实的,即是@Value不 2,[ A或B或C]将变为TRUE,而不管B和C的结果如何。 B和C实际上仅在@Value = 2时才被检查,这是初衷。

0
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType)