Jquery 多个可选参数的sql搜索查询
我正试图在我的文档归档系统上编写一个高级搜索页面的查询。我正在尝试通过多个可选参数进行搜索。我有大约5个参数,可以是空字符串或搜索字符串。我知道我不应该检查每个组合是否为字符串或空,并为每个组合创建单独的存储过程 编辑: 最终使用了:Jquery 多个可选参数的sql搜索查询,jquery,sql,sql-server,search,stored-procedures,Jquery,Sql,Sql Server,Search,Stored Procedures,我正试图在我的文档归档系统上编写一个高级搜索页面的查询。我正在尝试通过多个可选参数进行搜索。我有大约5个参数,可以是空字符串或搜索字符串。我知道我不应该检查每个组合是否为字符串或空,并为每个组合创建单独的存储过程 编辑: 最终使用了: ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '') 您可以在WHERE子句中输入OR,如下所示: WHERE (@var1 = '' OR col1 = @var1) AND (@var2 =
ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '')
您可以在WHERE子句中输入OR,如下所示:
WHERE
(@var1 = '' OR col1 = @var1) AND
(@var2 = '' OR col1 = @var2) AND
(@var3 = '' OR col1 = @var3) ...
您可以将可选参数传递给存储过程,但优化器将根据您对该过程的特定调用生成计划。SQLServer2005及更高版本中有一些技巧可以避免这种情况(参数嗅探、“无编译”提示等) 尽管如此,我还是更喜欢用查询的核心构建一个视图,然后在几个具有特定参数的过程中使用该视图。这使得SQL可以根据需要/应该进行优化,而且我仍然可以整合查询细节。您可以像这样使用COALESCE(或ISNULL):
更好的方法是将参数设置为可选的NULL,然后在WHERE子句中进行测试,就像空字符串一样…我通常这样做:p
WHERE (@var1 IS NULL OR col1 = @var1)
AND (@var2 IS NULL OR col2 = @var2)
…另一种方法是在存储过程中动态构建SQL,这将为查询生成最佳可能的计划,并且无论如何都将创建和使用一个计划(在2005年及以后)。虽然此解决方案可行,但其成本非常昂贵。不要使用或。。。相反,请使用ISNULL(上面的示例)。此解决方案在所有情况下都有效。IsNull/Coalesce解决方案只能在受控环境下工作。使用Coalesce时,仍在测试列是否等于某个值。如果列中的值为NULL,则该值将不相等,并且不会返回该行。如果列值为NULL,则此解决方案将不起作用,因为无法以这种方式测试“不能为NULL”。如果该值为NULL,则该行将被过滤掉。这不是您想要的。在其中条件下调用函数会降低性能。不使用coalesce函数调用此函数,其中(@var1为null或col1=@var1),另请参见:
WHERE (@var1 IS NULL OR col1 = @var1)
AND (@var2 IS NULL OR col2 = @var2)