2013-10-01 6 views
2

У меня есть ситуация, когда я хочу искать поле в предложении where только в том случае, если битовая переменная 1 игнорирует его.Бит-поле в where где

@Active bit = 0 

select * from Foo where firstname = 'xyz' and 

if(@active=1) 

затем поиск в активном столбце else игнорирует фильтрацию в столбце Active. Как я могу иметь, что в простом состоянии, вместо проверки каждого параметра отдельно, а затем здание, где положения

ответ

5

Просто простая логика, как правило, хватает:

select * from Foo where firstname = 'xyz' and 
    (@Active = 0 or Active = <filter condition>) 

Общих рекомендаций о написании кода для любых условий поиска, вы могли бы сделать хуже, чем прочитать Erland Sommarskog-х Dynamic Search Conditions in T-SQL

+0

ТНХ, который помог. – sansid

0

Как насчет:

DECLARE @Active bit 

if @Active = 1 
BEGIN 
    (select * from Foo where firstname = 'bar' and Active = --condition) 
END 
else 
BEGIN 
    (select * from Foo where firstname = 'bar') 
END 

из Конечно, что-то должно будет установить значение @Active где-то между объявлением и оператором if...else.

0

Кажется, что Active - это фактическая колонка, а также в вашем столе. с помощью Case stmt вы можете сделать поиск эффективным, так как он будет использовать соответствующие индексы, которые могут быть у вас на этой таблице.

DECLARE @Active BIT=0 
    SELECT * 
    FROM Foo 
    WHERE firstname = 'a' 
    AND active = CASE WHEN @Active=1 THEN @Active ELSE Active END 
0

вы можете написать это, как показано ниже

select * from Foo where firstname = 'xyz' and (@isactive=0 or (some conditions)) 
Смежные вопросы