代码之家  ›  专栏  ›  技术社区  ›  dkackman

是否可以将CASE与IN一起使用?

  •  2
  • dkackman  · 技术社区  · 14 年前

    WHERE 由输入参数确定的子句。比如:

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

    我试过所有我能想到的移动箱子的方法。这有可能吗?

    2 回复  |  直到 14 年前
        1
  •  7
  •   KM.    14 年前

    试试这个:

    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)

    如果您使用的是正确的SQLServer2008版本,那么只需添加 OPTION (RECOMPILE)

    想想这个, 选项(重新编译) OR s) 地址:

    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列中定义了索引)

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