Множественное предложение IF в предложении WHERE в T- SQL - PullRequest
1 голос
/ 12 января 2020

У меня есть таблица # t1, содержащая три столбца, один из которых называется root_symbol.

Я хочу выбрать все элементы из таблицы # t1, удовлетворяющие условию переменной @root.

Однако переменная @root может иметь четыре различных значения, поэтому я хотел бы динамически выбирать фильтр, применяемый оператором where, в зависимости от объявленного значения переменной.

declare @root integer
set @root = 1

select * from #t1
where root_symbol in
case when @root = 1 then ('ES')
        when @root = 2 then ('EW', 'EW1', 'EW2', 'EW3', 'EW4') 
        when @root = 3 then ('E1C', 'E2C', 'E3C', 'E4C', 'E5C') 
        when @root = 4 then ('E1A', 'E2A', 'E3A', 'E4A', 'E5A') 
end

Я видел, как это делается с использованием case when, но не с условием сопоставления значений in.

Альтернативой может быть создание оператора if с четырьмя различными операторами выбора внутри, однако и здесь я не уверен как работать с несколькими предложениями if в sql.

Есть идеи, как это решить?

1 Ответ

6 голосов
/ 12 января 2020

Не используйте case. Используйте простые сравнения:

where (@root = 1 and root_symbol in ('ES')) or
      (@root = 2 and root_symbol in ('EW', 'EW1', 'EW2', 'EW3', 'EW4')) or
      (@root = 3 and root_symbol in ('E1C', 'E2C', 'E3C', 'E4C', 'E5C')) or 
      (@root = 4 and root_symbol in ('E1A', 'E2A', 'E3A', 'E4A', 'E5A'))

Как правило, использование выражений case в предложении where - плохая идея (есть некоторые исключения). Поскольку case устанавливает порядок оценки своих предложений, он не позволяет оптимизатору что-либо делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...