我是存储过程的新手,仍然在学习,下面是我尝试过并且仍在工作的内容。但是,我只进行了一次更改,ad.Indicator
并且在中写入了三次相同的查询IF, ELSE IF
。
有一个更好的方法吗?(我正在使用SQL Server)
ALTER PROCEDURE TestingSP
@startdate Datetime,
@enddate Datetime,
@source Varchar(10)
AS
BEGIN
IF(@source = 'None')
SELECT *
FROM FD.T fd
INNER JOIN AD.T ad ON fd.OCD = ad.ACD
WHERE fd.SG BETWEEN @startdate AND @enddate
ELSE IF(@source = 'Air')
SELECT *
FROM FD.T fd
INNER JOIN AD.T ad ON fd.OCD = ad.ACD
WHERE fd.SG BETWEEN @startdate AND @enddate AND ad.Indicator = 'True'
ELSE IF(@source = 'Not Air')
SELECT *
FROM FD.T fd
INNER JOIN AD.T ad ON fd.OCD = ad.ACD
WHERE fd.SG BETWEEN @startdate AND @enddate AND ad.Indicator = 'False'
END
一种方法(尽管这可能会导致更糟糕的查询计划):
Select *
FROM FD.T fd
INNER JOIN AD.T ad on fd.OCD = ad.ACD
WHERE fd.SG BETWEEN @startdate AND @enddate
AND ad.Indicator = CASE
WHEN @source = 'Not Air' THEN 'False'
WHEN @source = 'Air' THEN 'True'
ELSE ad.Indicator
END
[是否会产生更好或更坏的计划还有待观察...]
另外,请注意:
不建议使用SELECT *。使用明确的列列表
包含字符串值“ True”和“ False”的列作为位列会更好
如果日期中有时间部分,请多加注意。如果这样做,有几种方法可以解决此问题,也许最直接的方法是强制转换为Date数据类型(从SQL Server 2008开始):
WHERE CAST(fd.SG as Date) BETWEEN @startdate AND @enddate
但是请注意,这可能会使适当索引的使用无效。(还假设@startDate
并且@enddate
没有时间部分)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句