14

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で定義されています。問題を理解するために必要なコードを記述しただけです。

前もって感謝します。

4

4 に答える 4

10
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が2でない場合、[AまたはBまたはC]はBおよびCの結果に関係なくTRUEになります。BとCは、実際@Value = 2には、が本来の意図である場合にのみチェックされます。

于 2012-11-01T06:02:57.117 に答える
6

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
于 2012-11-01T06:04:12.693 に答える
2

使用しているRDBMSはわかりませんが、SQL Serverの場合は、CASEステートメントを使用して確認できます。

条件のリストを評価し、複数の可能な結果式の1つを返します。

CASE式には、次の2つの形式があります。

単純なCASE式は、式を一連の単純な式と比較して、結果を判別します。

検索されたCASE式は、ブール式のセットを評価して結果を決定します。

どちらの形式も、オプションのELSE引数をサポートしています。

于 2012-11-01T06:02:31.303 に答える
0
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType)
于 2017-06-14T11:57:26.200 に答える