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
我认为你根本不想要一个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)
如果我理解正确,您希望三个条件为NULL或检查:
WHERE
/* ... */
AND SalesUserId = ISNULL(@SalesUserId, SalesUserId)
AND SiteId = ISNULL(@SiteId, SiteId)
AND BrandId = ISNULL(@BrandID, BrandID)
Run Code Online (Sandbox Code Playgroud)
请注意,这会强制进行表扫描,这可能不符合您的最佳利益.
| 归档时间: |
|
| 查看次数: |
30703 次 |
| 最近记录: |