Фильтрация с помощью ИЛИ против В

#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)