web-dev-qa-db-fra.com

Comment utiliser l'instruction If dans la clause Where en SQL?

Je dois utiliser si déclaration à l'intérieur de la clause where dans SQL.

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

Remarque: il ne s'agit pas du code complet. Tout est défini dans SP.I. Il suffit d'écrire le code nécessaire à la compréhension du problème.

Merci d'avance.

14
Asp_Newbie

Vous devez utiliser CASE Statement/Expression

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
6
Vishal Suthar
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 )

En gros, votre état était

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

retourné,

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

Lorsque (A) est vrai, c'est-à-dire que @Valeur est non 2, [A, B ou C] deviendra VRAI quels que soient les résultats de B et C. En réalité, B et C ne sont vérifiés que lorsque @Value = 2, qui est l'intention initiale.

9
RichardTheKiwi

Indiquez quel SGBDR vous utilisez, mais s'il s'agit de SQL Server, vous pouvez utiliser plutôt une instruction CASE

Évalue une liste de conditions et renvoie l'une des multiples possibles les expressions de résultat.

L'expression CASE a deux formats: 

La simple expression CASE compare une expression à un ensemble de simples expressions pour déterminer le résultat.

L'expression CASE recherchée évalue un ensemble d'expressions booléennes à déterminer le résultat.

Les deux formats prennent en charge un argument optionnel ELSE.

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