CAS可以用IN吗?

时间:2010-05-27 19:41:07

标签: tsql parameters case

我正在尝试使用输入参数确定的WHERE子句构造一个T-SQL语句。类似的东西:

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

我已经尝试过将IN,CASE等移动到我能想到的所有组合。是(或类似的东西)可能吗?

2 个答案:

答案 0 :(得分:7)

试试这个:

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

使用索引会出现问题。

具有动态搜索条件的密钥是确保使用索引,而不是如何轻松地重用代码,消除查询中的重复,或尝试使用相同的查询执行所有操作。这是一篇关于如何处理这个主题的非常全面的文章:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

它涵盖了尝试使用多个可选搜索条件编写查询的所有问题和方法。您需要关注的主要问题不是代码的重复,而是索引的使用。如果您的查询无法使用索引,那么它将执行不良。有几种技术可以使用,可能允许也可能不允许使用索引。

这是目录:

  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,则可以使用其他技术,请参阅:Dynamic Search Conditions in T-SQL Version for SQL 2008 (SP1 CU5 and later)

如果您使用的是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

并且可以使用索引(如果在Column2上定义了一个索引)

答案 1 :(得分:0)

if @param = 'whatever'
   select * from tbl where id in (1,2,4,5,8)
else
   select * from tbl where id in (9,7,3)