#sql #sql-server #tsql
Вопрос:
Общий фильтр в процедурах SQL выглядит примерно так:
WHERE (@a = 0 OR @a = a)
Очевидно, идея заключалась в том, чтобы отфильтровать a
, был ли предоставлен положительный параметр для процесса, но в противном случае показать все результаты. Конечно, существуют различные варианты этого, которые объясняют возможность нулей. Но, взяв конкретный пример, приведенный выше, было бы тождественно написать его следующим образом?
WHERE @a in (0, a)
Комментарии:
1. @WAMLeslie Это так.
2. @WAMLeslie Подождите, просто чтобы убедиться, вы говорите, что две версии не совпадают, если a-это столбец? Можете ли вы помочь мне понять, в чем будет разница?
3. @WAMLeslie Нет, это не то, чего я хочу. Я не уверен, что я мог бы сказать, чтобы создать такое впечатление? Идея заключается в том, что если я передам 7, то я хочу, чтобы он возвращал только записи, где a = 7. Я не хочу возвращать все строки, если a = 7 для любой строки в таблице. В этом не было бы никакого смысла??
4. @WAMLeslie Уверен, что это так. Это значение для текущей оцениваемой записи.
5. Если
a
это столбец, он все равно работает из-за контекста.where @a = a
относится к значениюa
в оцениваемой строке.
Ответ №1:
Да, эти выражения приведут к тем же результатам.
Это предполагает контекст:
declare @a int
set @a = 1
select *
from [sometable]
where @a in (0, a)
…где a
находится столбец int в sometable
таблице.
В этом случае вы получите все записи sometable
откуда a=1
.
Комментарии:
1. Я думаю, что ОПЕРАЦИОННАЯ более понятна для этого материала.
2. Может быть, для этого чрезвычайно простого примера. Когда у вас длинный список значений и более сложная логика,
IN
объединяйте значения очень аккуратно.3. Возможно, но в этом контексте больше не было бы И/ИЛИ ГДЕ логика и не была бы помещена в то же самое. Может быть, в другом месте. Скорее всего, я этого не понимаю, но если у вас есть время, можете ли вы добавить пример более сложной логики, который упростил бы вход?
4. @MichaelZ.
x in (1, 2, 3, 4, 5)
противx = 1 or x = 2 or x = 3 or x = 4 or x = 5
. Первый из них гораздо менее многословен.5. Я знаю, как
in
это работает. Я просто не очень хорошо объяснил, что я говорил. Я бы предположил, что это применяется в динамическом фильтре. НравитсяSELECT * FROM T WHERE (@CUST = '<ALL>' OR [Cust] = @CUST) AND (@CATEGORY = '<ALL>' OR [Category] = @CATEGORY)