2012-11-01 162 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)