在sql中替换If-else的最佳方法

时间:2012-10-16 10:29:41

标签: sql sql-server stored-procedures

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

此类动态标准查询编写的最佳参考由Erland Sommarskog here提供。

如果您只能通过从前端动态生成查询来提供过滤器要求,那么您将获得比SQL Server 2005的此模式更好的结果,尽管如果无法使用动态SQL,它仍然是最佳选择。 / p>

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分: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 

答案 4 :(得分: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