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.
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
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.
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.
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType)