SQL Server, выбрав из двух таблиц с использованием оператора IF внутри оператора WHERE в зависимости от параметра

Как я могу сделать следующее в SQL Server

DECLARE @Local nvarchar(20) SET @Local = 'True' SELECT * FROM My_Table WHERE my_ID IN (IF @Local = 'True' SELECT AllIDs FROM ATable ELSE SELECT TeamIDs FROM TeamTable ) 

Пойдите для союза: –

 SELECT * FROM My_Table WHERE my_id IN ( SELECT AllIDs AS MyIDs FROM ATable WHERE @Local = 'True' UNION SELECT TeamIDs AS MyIDs FROM TeamTable WHERE @Local <> 'True' ) 
 SELECT * FROM mytable WHERE my_id IN ( SELECT allids FROM atable WHERE @Local = 'True' ) UNION ALL SELECT * FROM mytable WHERE my_id IN ( SELECT teamids FROM teamtable WHERE COALESCE(@Local, '') <> 'True' ) 

Оптимизатор оптимизирует неверный запрос, поэтому производительность будет соответствовать производительности соответствующего (оставшегося) запроса.

 DECLARE @Local nvarchar(20) SET @Local = 'True' SELECT * FROM My_Table WHERE my_ID IN ( SELECT AllIDs FROM ATable WHERE @Local = 'True' UNION ALL SELECT TeamIDs FROM TeamTable WHERE @Local != 'True' ) 

Не делай этого!

(по крайней мере, если вам не нужна производительность)

Конечно, есть способ сделать это, но вы действительно не должны – причина состоит в том, что (в общем) один оператор имеет только один план выполнения, однако у вас есть по существу 2 (потенциально очень разные) запросы:

 SELECT * FROM My_Table WHERE my_ID IN (SELECT AllIDs FROM ATable) SELECT * FROM My_Table WHERE my_ID IN (SELECT AllIDs FROM TeamTable) 

Объединение этих двух запросов означает, что SQL-сервер вынужден одновременно и оптимизировать оба из них, используя только один план exectuion. В зависимости от того, насколько различны эти две таблицы, это может работать нормально, или это может пойти ужасно ужасно.

Например, если ATable содержит только 1 строку, а TeamTable содержит все идентификаторы в My_Table то SQL-сервер должен выбирать / компрометировать между выполнением поиска (лучше всего использовать ATable ) и сканирование таблицы (лучше всего, если использовать TeamTable ) – независимо от того, заканчивается тем, что SQL-сервер не может выполнять оба запроса с использованием оптимального плана выполнения (если оба плана выполнения не совпадают).

Вместо этого вы должны использовать 2 утверждения:

 DECLARE @Local nvarchar(20) SET @Local = 'True' IF @Local = 'True' SELECT * FROM My_Table WHERE my_ID IN (SELECT AllIDs FROM ATable) ELSE SELECT * FROM My_Table WHERE my_ID IN (SELECT AllIDs FROM TeamTable) 

Фактически в этом конкретном случае вам может быть лучше выбрать список идентификаторов во временную таблицу.

  • Использование предложения WHERE при суммировании записей с использованием COUNT () и JOIN
  • Как использовать инструкцию If в разделе Where в SQL?
  • SQL Server: несколько табличных объединений с одним или несколькими предложениями WHERE
  • Выбор запроса в многораздельной таблице
  • Что означает это предложение SQL WHERE?
  • Несколько предложений в SQL Server, где все столбцы не равны нулю
  • T-SQL Two Where Clauses на одном столбце
  • Как пропустить или проигнорировать предложение where, когда параметр пуст или пуст
  • Как использовать параметр Where в Exec Stored Procdure
  • Добавить / Пропустить WHERE CLAUSE на основе условия
  • SQL оптимизирует условия в разделе where
  • Давайте будем гением компьютера.