Можно ли использовать CASE с IN? - PullRequest
2 голосов
/ 27 мая 2010

Я пытаюсь создать оператор T-SQL с предложением WHERE, определяемым входным параметром. Что-то вроде:

SELECT * FROM table
WHERE id IN
CASE WHEN @param THEN
(1,2,4,5,8)
ELSE
(9,7,3)
END

Я перепробовал любую комбинацию перемещения IN, CASE и т. Д., О которой только могу подумать. Возможно ли это (или что-то подобное)?

Ответы [ 2 ]

7 голосов
/ 27 мая 2010

попробуйте это:

SELECT * FROM table
WHERE (@param='??' AND id IN (1,2,4,5,8))
OR (@param!='??' AND id in (9,7,3))

у этого будет проблема с использованием индекса.

Ключ к условиям динамического поиска заключается в том, чтобы убедиться, что используется индекс, вместо того, чтобы легко использовать код, устранить дублирования в запросе или попытаться выполнить все с одним и тем же запросом. Вот очень полная статья о том, как справиться с этой темой:

Условия динамического поиска в T-SQL Эрланда Соммарского

Он охватывает все проблемы и методы попыток написания запросов с несколькими необязательными условиями поиска. Это главное, что вам нужно беспокоиться, это не дублирование кода, а использование индекса. Если ваш запрос не может использовать индекс, он будет плохо сформирован. Существует несколько методов, которые могут использоваться или не разрешать использование индекса.

вот оглавление:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

если вы работаете с верной версией SQL Server 2008, можно использовать дополнительную технику, см .: Условия динамического поиска в версии T-SQL для SQL 2008 (SP1 CU5 и более поздние версии)

Если вы используете правильный выпуск SQL Server 2008, вы можете просто добавить OPTION (RECOMPILE) к запросу, и значение локальной переменной во время выполнения используется для оптимизации.

Учтите, что OPTION (RECOMPILE) примет этот код (где индекс не может использоваться с этим беспорядком OR с):

WHERE
    (@search1 IS NULL or Column1=@Search1)
    AND (@search2 IS NULL or Column2=@Search2)
    AND (@search3 IS NULL or Column3=@Search3)

и оптимизировать его во время выполнения (при условии, что только @ Search2 был передан со значением):

WHERE
    Column2=@Search2

и индекс можно использовать (если он определен в столбце 2)

0 голосов
/ 28 мая 2010
if @param = 'whatever'
   select * from tbl where id in (1,2,4,5,8)
else
   select * from tbl where id in (9,7,3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...