Я пытаюсь использовать простой оператор if в условии where в SQL. Я не хочу CASE
заявление, так как это очень просто.
Пример:
CREATE PROCEDURE [dbo].[usp_GetStatus]
@siteId INT,
........
FROM sites
WHERE StartDate = @reportMonth
AND..
AND ...
AND IF(@siteId > 0) sites.SiteId = @siteId
........
Я хотел бы определить просто, как указано выше.
Мой параметр siteId
может быть равен 0 или больше, если пользователь передает целочисленное значение. Я хочу опустить условие AND, если параметр siteId
равен 0.
Обычно вы обрабатываете это с помощью логической логики в вашем SQL. Итак, вы можете просто написать:
WHERE StartDate = @reportMonth
AND..
AND ...
AND (@siteId <=0 OR sites.SiteId = @siteId)
Поэтому, если @siteId
не больше 0, остальная часть предложения OR
игнорируется, но если это так, то оценивается ваше предложение sites.SiteId
. Обычно для хранимого процесса я устанавливаю значение по умолчанию равным нулю и проверяю его на нулевое значение:
CREATE PROCEDURE [dbo].[usp_GetStatus]
@siteId INT = NULL,
........
from sites;
WHERE StartDate = @reportMonth
AND..
AND ...
AND (@siteId IS NULL OR sites.SiteId = @siteId)
В вопросе конкретно говорилось, что они знали об утверждении case
, но хотели альтернативу.
Да как-то пропустил
я бы скорее предложил
CREATE PROCEDURE [dbo].[usp_GetStatus]
@siteId INT,
........
FROM sites
WHERE StartDate = @reportMonth
AND..
AND ...
AND
sites.SiteId = case when @siteId > 0 then @siteId else sites.SiteId end
Это хороший ответ, но для полноты картины я бы также упомянул выражение
case
.