2016-12-13 7 views
1

アプリケーションは、UIからクエリに5種類のフィルタ条件を渡します。すなわち、SQLクエリを使用した複合フィルタ条件

、私はそれが非常に長く来ているさまざまな可能性を持つこれらの条件を追加--STORE CODE DESC NOTES QTY.、すなわち

--1 0 0 0 0 
IF @Store<>'0' AND @code='' AND @DESC='' AND @Notes='' AND @QTY=0 
--1 1 0 0 0 
--1 1 0 0 1 
--1 1 1 0 0 
--1 1 1 1 0 
etc.......... 

として単一のクエリを渡すために、これを簡素化する方法があります。質問が理解できることを願っています。私は以下のように行っている

サンプルコード、

SET @sql = 'Select * from tbl_store Where Inactive=0 '; 
--10000 
    IF @Store<>'0' AND @Code='' AND @Description='' AND @Notes='' --AND @Qty<>'' 
    SET @sql += ' AND [email protected] AND Quantity = @Qty'; 

    --11000 
    ELSE IF @Store<>'0' AND @Code<>'' AND @Description='' AND @Notes='' --AND @Qty<>'' 
    SET @sql += ' AND [email protected] AND [email protected] AND Quantity = @Qty'; 

........................

答えて

7

私は、クエリの外のいずれかの検証を置き、次のように単にあなたのクエリをフィルタするでしょう。

SET @IsValidFilter=<YOUR VALIDATION LOGIC HERE>--IF YOU CAN'T TRUST INCOMING VALUES 

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    (@IsValidFilter=1) 
    AND 
    (@Store IS NULL OR [email protected]) 
    AND 
    (@code= IS NULL OR [email protected]) 
    AND 
    (@DESC IS NULL OR [email protected]) 
    AND 
    (@Notes IS NULL OR [email protected]) 

あなたが渡された値を信頼し、パラメータ値の組み合わせに基づいて、いくつかのロジックを必要とすることができない場合、@ValidFilterフラグを作成するために、より読みやすいだろうと単純に最終AND @ValidFilter=1とそうでないを追加WHEREであまりにも多くの。

私は、可能な場合、動的クエリを廃止し、このようなものだろう
+0

ありがとう、これは私が探していたものです。 – Developer

+0

うれしい私は助けることができました。 –

1

それらをいずれかの操作を行います。一度に:

SET @sql = 'Select * from tbl_store Where Inactive = 0 '; 
IF @Store <> '0' 
    SET @sql += ' and Store = @Store'; 
IF @Qty <> '' 
    SET @sql += ' and Quantity = @Qty'; 
. . . . 

パフォーマンス上の理由から、あなたがやっていることは良い考えです。適切なインデックスが利用可能な場合、究極のwhere句は適切なインデックスを利用できるはずです。このような単一where条件はしません:

where (@store = '0' or start = @store) and 
     (@qty = '' or quantity = @qty) and 
     . . . 
1

select * 
from tbl_store ts 
where ts.Inactive = 0 
and (
    (@Store <> '0' and @Description = '' and @Notes = '' and Store = @Store and Quantity = @Qty) 
or 
    (@Store <> '0' and @Code <> '' and @Notes <> '' and Code = @Code and Store = @Store and Quantity = @Qty) 
); 

は、そのようなあなたのような動的クエリを使用してセキュリティホールにつながることができ、そして物事が行われている方法に関する一般的な混乱を。私の意見では、それは最後のリゾートの一つでなければなりません。

関連する問題