Оператор CASE в предложении WHERE с условием IN - PullRequest
0 голосов
/ 30 октября 2019

Могу ли я иметь оператор CASE с условием IN в предложении WHERE запроса SQL Server?

Я пытаюсь вернуть все события в Великобритании, когда @DivisionCode = 'UK' еще всесобытия для США и CA.

Я пробовал это, но безуспешно:

SELECT * FROM Events
WHERE Division IN (CASE WHEN @DivisionCode = 'UK' THEN 'UK' ELSE 'CA,' + 'US' END))

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Похоже, что вы после логической логики:

SELECT {columns}
FROM dbo.Events E
WHERE (E.Division = 'UK' AND @DivisionCode = 'UK')
   OR (E.Division IN ('CA','US') AND @DivisionCode IS NULL); --Assumes DivisionCode won't have a value

Проблема с этим, однако, в том, что у вас есть запрос на все запросы. Таким образом, у вас может имеется плохо кэшированный план запроса для выполняемого запроса. Один из способов справиться с этим - добавить OPTION (RECOMPILE) в конец запроса, чтобы каждый раз создавать план запроса. В противном случае вы могли бы использовать IF Logic и 2 оператора:

IF @DivisionCode = 'UK'
    SELECT {columns}
    FROM dbo.Events E
    WHERE E.Division = 'UK';
ELSE
    SELECT {columns}
    FROM dbo.Events E
    WHERE E.Division IN ('US','CA');

Для простоты, которую мы имеем, я бы сказал, что последнее будет лучше.

Примечание: Естьне Case операторы в T-SQL. Что у вас есть CASE выражение. Case операторы аналогичны IF и изменяют логический «поток» SQL, где выражение возвращает скалярное значение.

2 голосов
/ 30 октября 2019

Вам не нужно case в where. Просто используйте логическую логику:

SELECT e.*
FROM Events e
WHERE (@DivisionCode = 'UK' AND Division = 'UK') OR
      (@DivisionCode <> 'UK' AND Division IN ('CA', 'US'));

Это предполагает, что @DivisionCode не NULL. NULL значения могут быть легко включены в логику, если это возможно.

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