SQLのwhere句内でifステートメントを使用する必要があります。
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
注:これは完全なコードではなく、すべてがSP.Iで定義されています。問題を理解するために必要なコードを記述しただけです。
前もって感謝します。
CASEステートメント/式 を使用する必要があります
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 )
基本的に、あなたの状態は
if (@Value=2)
TEST FOR => (I.RecurringCharge=@Total or @Total is NULL )
ひっくり返して、
AND (isnull(@Value,1) <> 2 -- A
OR I.RecurringCharge = @Total -- B
OR @Total is NULL ) -- C
(A)が真の場合、つまり@Valueがnot 2の場合、[AまたはBまたはC]は、BおよびCの結果に関係なくTRUEになります。 BとCは、@Value = 2
、これは当初の意図です。
NtoはどのRDBMSを使用しているかを確認しますが、SQL Serverの場合は CASEステートメント
条件のリストを評価し、複数の可能な結果式の1つを返します。
CASE式には2つの形式があります。
単純なCASE式は、式を一連の単純な式と比較して結果を決定します。
検索されたCASE式は、一連のブール式を評価して結果を決定します。
どちらの形式もオプションのELSE引数をサポートしています。
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType)