2017-02-02 5 views
0

У меня есть большой набор данных, который возвращается из представления в SQL Server 2012. Мне нужно отфильтровать данные на основе 6 разных критериев. Я установил параметры в отчете и хочу использовать параметры в запросе для уменьшения размера.
Так что у меня следующая ситуация:case case with wildcard in where where

select * from vw_ABC where p1 in @p1 and p2 in @p2 ... 

Хитрость в том, как справиться с ситуацией, когда пользователь не хочет, чтобы фильтровать по одному из критериев. Я пытаюсь избежать динамического sql, но если это единственный способ, пусть и так.
Когда вызывается отчет, пользователь будет иметь все 6 параметров. Значения по умолчанию будут «ВСЕ». Они могут создавать отчет с одним или всеми параметрами. В большинстве случаев это будет 2 или 3 (имя города zip orderid такие вещи)
Любая помощь будет принята с благодарностью.

+0

Вы действительно говорите бой 'в'? Или это скорее «где p1 = @ p1 ...»? –

+0

где (@ p1 = 'ALL' или p1 = @ p1) и ... Может возникнуть проблемы с производительностью – Serg

+1

Какие СУБД вы используете? Пожалуйста, отметьте его. –

ответ

0

Я полагаю, вы не говорите о IN, а примерно о =. Это было бы:

select * 
from vw_ABC 
where (p1 = @p1 or @p1 = 'ALL') 
    and (p2 = @p2 or @p2 = 'ALL') 
    ... 
0

Один подход заключается в создании второго набора параметров, чтобы указать, нужно ли или не использовать соответствующий параметр:

SELECT * 
FROM vw_ABC 
WHERE 
    (@u1=0 OR [email protected]) 
AND (@u2=0 OR [email protected]) 
AND (@u3=0 OR [email protected]) 

Таким образом, вам не нужно для резервирования специальное значение означает все: если вы хотите использовать @pX, установите @uX на 1, где X - номер параметра.

+0

Все, у меня будет несколько значений для параметров. Поэтому мне нужно проверить, является ли значение p1 «in» в списке значений @ p1, не равным параметру. – TheVavs

0

Настройка параметров как опция и проверить NULLs .... дайте мне выкопать пример для вас

declare @id int = 1 

select * from users u 
where (@id IS NULL and u.id=u.id) or ([email protected])