2012-11-01 15 views
15

Potrzebuję użyć, jeśli instrukcja wewnątrz klauzuli gdzie w sql.Jak używać instrukcji Oświadczenie w Where Clause w SQL?

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 

Uwaga: To nie jest pełna code.Everything jest zdefiniowana w SP.I Wystarczy napisany kod, który był potrzebny do zrozumienia problemu.

Z góry dziękuję.

Odpowiedz

6

Musisz użyć 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

Próbowałem sam, ale dał mi błąd „Nieprawidłowa składnia w pobliżu«=»” na ta linia , gdy 1 wtedy ([email protected] lub @Total jest NULL) –

+0

Tak, to daje błąd w tej samej lokalizacji. Jestem już wykonywany w moim oryginalnym SP. –

+0

nie można zrozumieć, co jest nie tak w pobliżu "=". Przy okazji. –

2

Nto pewności co RDBMS używasz, ale jeśli jest to SQL Server można patrzeć raczej za pomocą CASE statement

Ocenia listę warunków i zwraca jedną z wielu możliwych wyrażeń wynikowych.

CASE wyrażenie ma dwóch formatach:

Proste wyrażenie CASE porównywane wyrażenie z zestawem prostych wyrażeń w celu określenia rezultatu.

Szukane wyrażenie CASE ocenia zestaw wyrażeń logicznych na określający wynik.

Oba formaty obsługują opcjonalny argument ELSE.

+0

Używam SQL Server –

+0

Wtedy raczej spojrzeć za pomocą instrukcji 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) 

Zasadniczo, twój stan był

if (@Value=2) 
    TEST FOR => ([email protected] or @Total is NULL)  

odwrócone,

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

Kiedy (A) jest prawdziwa, tzn @Value jest nie 2 [ A lub B lub C] staną się PRAWDZIWE, niezależnie od wyników B i C. B i C są w rzeczywistości sprawdzane tylko wtedy, gdy @Value = 2, co jest pierwotną intencją.

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