попробуйте это:
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)