I have a SQL Server 2005 stored procedure that performs a query. This stored procedure takes in three parameters. The parameters are as follows:
@Stat
there is no "right way", it depends on many factors, here is a great article describing the PROs and CONs of each way to have dynamic search conditions:
http://www.sommarskog.se/dyn-search.html
One way:
SELECT *
FROM Customer c
WHERE c.StateID=@StateID
AND (@CountyID IS NULL OR c.CountyID=@CountyID)
AND (@CityID IS NULL OR c.CityID=@CityID)
Another way:
SELECT *
FROM Customer c
WHERE c.StateID=@StateID
AND c.CountyID=ISNULL(@CountyID, c.CountyID)
AND c.CityID=ISNULL(@CityID, c.CityId)
SELECT *
FROM Customer c
WHERE c.StateID=@StateID
AND c.CountyID= ISNULL(@CountyID, c.CountyID)
AND c.CityID = ISNULL(@CityID, c.CityID)
SELECT * FROM Customer c WHERE (c.StateID=@StateID) AND ((c.CountyID=@CountyID) OR (@CountyID IS NULL)) AND ((c.CityID=@CityID) OR (@CityID IS NULL))
Try it with coalesce, I think it's a very elegant, clean approach:
SELECT *
FROM Customer c
WHERE
c.StateID=@StateID
AND c.CountyID = COALESCE(@CountyID, c.CountyID)
AND c.CityID = COALESCE(@CityID, c.CityID)
(Be aware though - this will filter out records with nulls in CountyID or CityID.)
Couple those with some OR statements:
SELECT *
FROM
Customer c
WHERE
c.StateID=@StateID
AND ( c.CountyID=@CountyID OR @CountyID IS NULL )
AND ( c.CityID=@CityID OR @CityID IS NULL )
For each of those parameters, if it is null, then the check is basically ignored.