1

我的网站中有一个搜索选项,有 4 个搜索条件,不必输入所有这些条件进行搜索。我想在我的数据层更具体地说是我的存储过程中实现这个逻辑。一种这样的方法是

if ( all four are empty)
select command
else if ( 3 are empty
select command
and so on...

有没有其他方法可以用更好的逻辑替换这些 IF 语句。简而言之,我希望仅根据用户提供的值进行搜索

4

5 回答 5

3

如果您使用的是 SQL Server 2008 或更高版本,除了特定服务包和修补程序级别的极少数未修补安装之外,此模式将为您提供最佳性能。

select ...
  from ...
 where (@criteria1 is null or column1 = @criteria1)
   and (@criteria2 is null or column2 = @criteria2)
       option (recompile)

此类动态标准查询编写的最佳参考是 Erland Sommarskog 的此处

如果您可以通过从前端动态生成查询来仅显示所需的过滤器,那么对于 SQL Server 2005,您将获得比此模式更好的结果,尽管如果动态 SQL 不可行,它仍然是最佳选择。

于 2012-10-16T10:32:21.207 回答
1

您可以使用案例逻辑:

SELECT 
   CASE 
      WHEN  all four are empty THEN expression
      WHEN 3 are empty THEN expression 
   END 
FROM ...

在此处查看详细信息:http: //msdn.microsoft.com/en-us/library/ms181765.aspx

于 2012-10-16T10:34:53.123 回答
0

创建基本查询并基于 4 个输入值动态附加在 where 子句中。

于 2012-10-16T10:32:58.643 回答
0

您可能正在寻找如下内容

Create sp datasearch
(
@param1 datatype=null,
@param2 datatype=null,
@param3 datatype=null,
@param4 datatype=null
)
as

select * from table where 
col1=isnull(@param1 ,col1) and 
col2=isnull(@param2 ,col2) and 
col3=isnull(@param3 ,col3) and 
col4=isnull(@param4 ,col4) and 
于 2012-10-16T10:37:12.330 回答
0

以我的经验,这种搜索还需要一个排名——匹配 4 个条件的记录比匹配一个条件的记录更重要。

我现在无法访问数据库,所以下面的语法可能有点损坏,但原则上:

select ID, column1, column2, column3, column4, count(*) as rank
from 
(select ID, column1, column2, column3, column4
from searchtable
where column1 = @criteria1
union
select ID, column1, column2, column3, column4
from searchtable
where column2 = @criteria2
union
select ID, column1, column2, column3, column4
from searchtable
where column3 = @criteria3
union
select ID, column1, column2, column3, column4
from searchtable
where column4 = @criteria4)
group by select ID, column1, column2, column3, column4
order by rank desc
于 2012-10-16T10:42:52.663 回答