У меня есть T-SQL запрос (SQL Server 2008/2012), который использует следующую конструкцию:SQL Server: подзапросы в «логический» ИНЕК
WHERE (@param1 IS NULL OR column1 = @param1)
AND (@param2 IS NULL OR column2 = @param2)
AND (@param3 IS NULL OR column3 = @param3)
Это прекрасно работает и автоматически оптимизирует любого из И 'ed частей предложения WHERE с параметрами NULL.
Но когда я делаю это же самое с подзапроса, оптимизатор, кажется, все-таки выполнить подзапросы, даже если парам является NULL:
WHERE
(@param1 IS NULL OR column1 IN (SELECT column
FROM table
WHERE column = @param1))
AND (@param2 IS NULL OR column2 IN (SELECT column
FROM table
WHERE column = @param2))
AND (@param3 IS NULL OR column3 IN (SELECT column
FROM table
WHERE column = @param3))
Мой вопрос, почему бы оптимизатор даже рассматривать «IN» SELECT, поскольку тот факт, что параметр имеет значение NULL, должен иметь «короткую замыкаемость» этой части запроса?
Насколько я знаю, в SQL Server нет «короткого замыкания». Вам нужно использовать 'CASE', где вы можете добиться« короткого замыкания ». – cha
Прочтите мой [этот ответ] (http://stackoverflow.com/questions/22978759/handling-select-condition-dynamically/22978868#22978868) для пример использования CASE – cha
@cha: Я уверен, что первый пример кода работает так, как ожидалось; Я не изобретал это, но я использовал его в течение некоторого времени, и план выполнения доказывает ожидаемое поведение. Второй пример кода также работает, но план выполнения показывает, что подзапросы все еще выполняются. – eric