Alternatives to IF ELSE in stored procedure SQL Server
sql, sql-server, stored-procedures
Solution
One way to do this (although it might possibly result in a worse query plan):
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
[Whether that generates a better or worse plan remains to be seen...]
In addition, please note:
Using SELECT * is not recommended. Use an explicit column list
A column containing the string values 'True' and "False' would be better as a bit column
Be careful if your dates have a time portion. If they do, there are several ways to handle this, perhaps the most straightforward way is to cast to Date data type (SQL Server 2008 onwards):
WHERE CAST(fd.SG as Date) BETWEEN @startdate AND @enddate
But be aware that this might invalidate the use of an appropriate index. (Also assumes that `@startDate` and `@enddate` do not have a time portion)
Problem
I am new to stored procedures and still learning, below is what I tried and is working also. But, I have only one change on `ad.Indicator` and I am writing the same query thrice in `IF, ELSE IF`. Is there a better way to do this? (I am using 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 ```