2008-12-02 71 views
5

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

编辑: 最终使用:

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

另请参阅:http://stackoverflow.com/questions/532468/ignoring-a-null-parameter-in-t-sql/532510#532510 – 2009-02-12 15:07:14

回答

8

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

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

你可以把OR在你的WHERE子句中,像这样:

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

虽然此解决方案可行,但它非常昂贵。不要使用OR ...而是使用ISNULL(上面的示例)。 – 2008-12-02 13:56:59

+2

该解决方案适用于所有情况。 IsNull/Coalesce解决方案只能在受控环境下运行。当您使用Coalesce时,您仍在测试一列以获得一个值。如果列中的值为NULL,则它不会是EQUAL,并且该行不会被返回。 – 2008-12-02 21:04:47

0

可以传递可选参数的存储过程,但优化器将建立一个基于您对该proc进行特定调用的计划。在SQL Server 2005及其后续版本中有一些技巧可以避免这种情况(参数嗅探,'没有编译'提示等)。

即便如此,我宁愿使用查询的核心构建一个视图,然后在具有特定参数的几个过程中使用该视图。这使得SQL可以根据需要进行优化,我仍然可以整合查询细节。

0

更妙的是使就像空字符串情况下,WHERE子句中的参数可选的NULL,然后测试...

6

我通常这样做:P

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

...

1

另一种方法是动态盟友在存储过程中构建了SQL,这为查询产生了最好的计划,并且无论如何将创建和使用计划(在2005年及以上)。