Как использовать инструкцию 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)