T-SQL - 在WHERE子句中使用CASE和参数

ind*_*dra 4 sql sql-server stored-procedures case sql-server-2008

我在Sales桌子上运行报告:

SaleId INT | SalesUserID INT | SiteID INT | BrandId INT| SaleDate DATETIME

我有一个噩梦试图做这样的事情了一套可空参数@SalesUserID,@SiteId,@BrandID和两个日期时间PARAMS.

附加点:只有一个过滤器参数将作为非空值传递.

SELECT * from Sales
WHERE
     SaleDate BETWEEN @StartDate AND @EndDate

AND
    SalesUserID IN
(
    Select SalesUserID FROM Sales
    WHERE
        SaleDate BETWEEN @StartDate AND @EndDate

    AND

        CASE
            WHEN @SalesUserId IS NOT NULL THEN SalesUserId = @SalesUserID
            WHEN @SiteId Is Not Null THEN SiteId = @SiteId
            ELSE BrandId = @BrandID
        END

)
Run Code Online (Sandbox Code Playgroud)

我在CASE这里的使用闻起来很糟糕,但我不知道如何纠正它.你能帮忙吗?

谢谢.

5arx

Fos*_*sco 9

我认为你根本不想要一个CASE声明,但是复合条件...给我一个机会让我知道:

select * 
from Sales
where SaleDate between @StartDate and @EndDate
and
   (
    (@SalesUserId is not null and SalesUserId = @SalesUserID)
    or (@SiteId is not null and SiteId = @SiteId)
    or (BrandId = @BrandID)
   )    
Run Code Online (Sandbox Code Playgroud)


Tom*_*lak 6

如果我理解正确,您希望三个条件为NULL或检查:

WHERE
    /* ... */
    AND SalesUserId = ISNULL(@SalesUserId, SalesUserId)
    AND SiteId      = ISNULL(@SiteId, SiteId)
    AND BrandId     = ISNULL(@BrandID, BrandID)
Run Code Online (Sandbox Code Playgroud)

请注意,这会强制进行表扫描,这可能不符合您的最佳利益.