Как использовать инструкцию If в разделе Where в SQL?
Мне нужно использовать оператор if внутри where where в sql.
Select * from Customer
WHERE ([email protected] OR @ISClose is NULL)
AND
(C.FirstName like '%'[email protected]+'%' or @ClientName is NULL )
AND
if (@Value=2)
begin
([email protected] or @Total is NULL )
end
else if(@Value=3)
begin
(I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%' or @Total is NULL )
end
Примечание. Это не полный код. Все это определено в SP.I Просто написано код, необходимый для понимания проблемы.
Спасибо заранее.
Ответы
Ответ 1
Вы должны использовать CASE Statement/Expression
Select * from Customer
WHERE ([email protected] OR @ISClose is NULL)
AND
(C.FirstName like '%'[email protected]+'%' or @ClientName is NULL )
AND
CASE @Value
WHEN 2 THEN (CASE I.RecurringCharge WHEN @Total or @Total is NULL)
WHEN 3 THEN (CASE WHEN I.RecurringCharge like
'%'+cast(@Total as varchar(50))+'%'
or @Total is NULL )
END
Ответ 2
SELECT *
FROM Customer
WHERE ([email protected] OR @ISClose is NULL)
AND (C.FirstName like '%'[email protected]+'%' or @ClientName is NULL )
AND (isnull(@Value,1) <> 2
OR I.RecurringCharge = @Total
OR @Total is NULL )
AND (isnull(@Value,2) <> 3
OR I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%'
OR @Total is NULL )
В основном, ваше состояние было
if (@Value=2)
TEST FOR => ([email protected] or @Total is NULL )
перевернулся,
AND (isnull(@Value,1) <> 2 -- A
OR I.RecurringCharge = @Total -- B
OR @Total is NULL ) -- C
Когда значение (A) истинно, т.е. @Value не 2, [A или B или C] станет ИСТИННЫМ независимо от результатов B и C. B и C на самом деле проверяются только тогда, когда @Value = 2
, что является первоначальным намерением.
Ответ 3
Не уверен, какие RDBMS вы используете, но если это SQL Server, вы можете посмотреть на использование CASE statement
Вычисляет список условий и возвращает один из нескольких возможных выражения результата.
Выражение CASE имеет два формата:
Простое выражение CASE сравнивает выражение с набором простых выражения для определения результата.
Выбранное выражение CASE оценивает набор булевых выражений для определить результат.
Оба формата поддерживают необязательный аргумент ELSE.
Ответ 4
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType)