存储过程SQL Server中IF-ELSE的替代方法
我对存储过程还不熟悉,还在学习,下面是我尝试过并正在工作的内容。但是,我在存储过程SQL Server中IF-ELSE的替代方法,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我对存储过程还不熟悉,还在学习,下面是我尝试过并正在工作的内容。但是,我在ad.Indicator上只有一个更改,我在IF,ELSE IF中三次编写相同的查询 有更好的方法吗?(我正在使用SQL Server) 实现这一点的一种方法(尽管可能会导致更糟糕的查询计划): [这是否会产生更好或更糟糕的计划还有待观察…] 此外,请注意: 不建议使用SELECT*。使用显式列列表 包含字符串值“True”和“False”的列最好作为位列 如果日期有时间段,请小心。如果有时间段,有几种方法可以处理此问题
ad.Indicator
上只有一个更改,我在IF,ELSE IF
中三次编写相同的查询
有更好的方法吗?(我正在使用SQL Server)
实现这一点的一种方法(尽管可能会导致更糟糕的查询计划):
[这是否会产生更好或更糟糕的计划还有待观察…]
此外,请注意:
- 不建议使用SELECT*。使用显式列列表
- 包含字符串值“True”和“False”的列最好作为位列
- 如果日期有时间段,请小心。如果有时间段,有几种方法可以处理此问题,最简单的方法可能是转换为日期数据类型(SQL Server 2008以后):
但请注意,这可能会使适当索引的使用无效。(还假定
@startDate
和@enddate
没有时间部分)+1他们确实有一个时间段,你能建议可以做些什么来处理吗?我相信这将错过“无”条件。可能情况是@source='Not Air'然后是'False'当'None'然后是ad.Indicator ELSE'True'end你是对的:我错过了(或者它被编辑了?).我会更新的.谢谢你回答米奇.谢谢你做了一个完整的工作!
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
WHERE CAST(fd.SG as Date) BETWEEN @startdate AND @enddate