存储过程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