我正在尝试在文档归档系统上为高级搜索页面编写查询。我正在尝试通过多个可选参数进行搜索。我有大约5个参数,可能是空字符串或搜索字符串。我知道我不应该检查每个字符串或为空,并为每个组合创建一个单独的存储过程。
编辑: 结束使用:
ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '')
答案 0 :(得分:8)
您可以像这样使用COALESCE(或ISNULL):
WHERE COALESCE(@var1, col1) = col1
AND COALESCE(@var2, col2) = col2
AND COALESCE(@var3, col3) = col3
答案 1 :(得分:6)
我通常这样做:P
WHERE (@var1 IS NULL OR col1 = @var1)
AND (@var2 IS NULL OR col2 = @var2)
...
答案 2 :(得分:1)
您可以将OR放在WHERE子句中,如下所示:
WHERE
(@var1 = '' OR col1 = @var1) AND
(@var2 = '' OR col1 = @var2) AND
(@var3 = '' OR col1 = @var3) ...
答案 3 :(得分:1)
另一种方法是在存储过程中动态构建SQL,这将为查询生成最佳计划,并且无论如何都将创建和使用计划(2005年及以上)。
答案 4 :(得分:0)
您可以将可选参数传递给存储过程,但优化程序将根据您对该proc进行的特定调用来构建计划。 SQL Server 2005及更高版本中有一些技巧可以避免这种情况(参数嗅探,'没有编译'提示等)。
即便如此,我更喜欢使用查询的核心构建视图,然后在具有特定参数的多个过程中使用该视图。这允许SQL根据需要进行优化,我仍然可以整合查询细节。
答案 5 :(得分:0)
更好的是使参数可选为NULL,然后在WHERE子句中测试就像空字符串一样......