2016-12-13 4 views
1

Die Anwendung übergibt 5 verschiedene Filterbedingungen von der Benutzeroberfläche an die Abfrage. dh --STORE CODE DESC NOTES QTY.komplexe Filterbedingungen mit SQL-Abfrage

Wenn ich diese Bedingungen mit verschiedenen Möglichkeiten hinzufügen, wird es sehr lange auf sich warten, das heißt

--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.......... 

gibt es eine Möglichkeit, dies zu vereinfachen, als einzelne Abfrage zu übergeben. Hoffe die Frage ist verständlich.

Beispielcode I wie unten getan haben,

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'; 

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

Antwort

7

ich außerhalb der Abfrage jede Validierung setzen würde und einfach filtern Sie Ihre Abfrage wie folgt.

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]) 

Wenn Sie nicht die Werte gekennzeichnet ist, übergeben vertrauen können und eine gewisse Logik auf einer Kombination von Parametern Werte basieren müssen, dann wäre es besser lesbar sein, eine @ValidFilter Flagge zu erstellen und einfach eine endgültige AND @ValidFilter=1 hinzufügen und nicht tun zu viel in der WHERE.

+0

danke, das ist, was ich gesucht habe .. – Developer

+0

Ich bin froh, dass ich helfen konnte. –

1

Haben sie ein auf einmal:

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

Aus Leistungsgründen ist das, was Sie tun, eine gute Idee. Wenn ein geeigneter Index verfügbar ist, sollte die ultimative where-Klausel in der Lage sein, die entsprechenden Indizes zu nutzen. Eine einzelne where Bedingung wie diese werden nicht:

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

Ich würde tun, weg mit der dynamischen Abfrage, wenn möglich, und so etwas tun:

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) 
); 

dynamische Abfragen verwenden, wie bei Ihnen, um Sicherheitslücken führen können und die allgemeine Verwirrung darüber, wie die Dinge getan . Meiner Meinung nach sollte es einer der letzten Resorts sein.