【问题标题】:sql search query for multiple optional parameterssql搜索查询多个可选参数
【发布时间】:2010-09-24 22:33:49
【问题描述】:

我正在尝试为我的文档归档系统上的高级搜索页面编写查询。我正在尝试通过多个可选参数进行搜索。我有大约 5 个参数可以是空字符串或搜索字符串。我知道我不应该检查每个字符串或为空并为每个组合创建单独的存储过程。

编辑: 最终使用:

ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '')

【问题讨论】:

标签: jquery sql sql-server search stored-procedures


【解决方案1】:

您可以像这样将 OR 放在 WHERE 子句中:

WHERE 
   (@var1 = '' OR col1 = @var1) AND
   (@var2 = '' OR col1 = @var2) AND
   (@var3 = '' OR col1 = @var3) ...

【讨论】:

  • 虽然这个解决方案可行,但它非常昂贵。不要使用 OR... 而是使用 ISNULL(上面的示例)。
  • 此解决方案适用于所有情况。 IsNull/Coalesce 解决方案只能在受控情况下工作。当您使用 Coalesce 时,您仍在测试一个列是否等于一个值。如果该列中的值为 NULL,则它不会是 EQUAL,并且不会返回该行。
【解决方案2】:

您可以将可选参数传递给存储过程,但优化器将根据您对该过程的特定调用构建计划。 SQL Server 2005 及更高版本中有一些技巧可以避免这种情况(参数嗅探、“无编译”提示等)

即便如此,我还是更喜欢用查询的核心构建一个视图,然后在几个带有特定参数的过程中使用该视图。这使 SQL 可以根据需要/应该进行优化,并且我仍然可以整合查询细节。

【讨论】:

    【解决方案3】:

    您可以像这样使用 COALESCE(或 ISNULL):

    WHERE COALESCE(@var1, col1) = col1 
    AND COALESCE(@var2, col2) = col2 
    AND COALESCE(@var3, col3) = col3
    

    【讨论】:

    • 如果列值为 NULL,则此解决方案将不起作用,因为不能以这种方式测试 NULL。如果值为 NULL,则该行将被过滤掉。这不是你想要的。
    • 函数调用条件会降低性能。而不是使用合并函数调用这个,其中(@var1 为 null 或 col1=@var1)
    【解决方案4】:

    更好的是让参数可选NULL,然后在WHERE子句中进行测试,就像空字符串的情况一样......

    【讨论】:

      【解决方案5】:

      我通常这样做:P

      WHERE (@var1 IS NULL OR col1 = @var1)
      AND (@var2 IS NULL OR col2 = @var2)
      

      ...

      【讨论】:

        【解决方案6】:

        另一种方法是在存储过程中动态构建 SQL,这会为查询生成尽可能好的计划,并且无论如何都会创建和使用计划(在 2005 年及以上)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多