SQL查询的复杂过滤条件

Dev*_*per 1 sql t-sql sql-server

应用程序从UI传递5个不同的过滤条件到查询.即--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..........
Run Code Online (Sandbox Code Playgroud)

有没有办法简化这个作为单个查询传递.希望这个问题是可以理解的.

我做的示例代码如下,

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

    --11000
    ELSE IF @Store<>'0' AND @Code<>'' AND @Description='' AND @Notes='' --AND @Qty<>''
    SET @sql += ' AND Store=@Store  AND Code=@Code  AND Quantity = @Qty';
Run Code Online (Sandbox Code Playgroud)

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

Ros*_*ush 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 MyTable.StoreID=@Store) 
    AND 
    (@code= IS NULL OR MyTable.CodeID=@Code)
    AND
    (@DESC IS NULL OR MyTable.Description=@Desc)
    AND
    (@Notes IS NULL OR MyTable.Notes=@Notes)
Run Code Online (Sandbox Code Playgroud)

如果你不能信任传入的值并且需要一些基于参数值组合的逻辑,那么创建一个@ValidFilter标志并简单地添加一个final AND @ValidFilter=1并且不会做太多的更可读WHERE.