我的网站中有一个搜索选项,有 4 个搜索条件,不必输入所有这些条件进行搜索。我想在我的数据层更具体地说是我的存储过程中实现这个逻辑。一种这样的方法是
if ( all four are empty)
select command
else if ( 3 are empty
select command
and so on...
有没有其他方法可以用更好的逻辑替换这些 IF 语句。简而言之,我希望仅根据用户提供的值进行搜索
我的网站中有一个搜索选项,有 4 个搜索条件,不必输入所有这些条件进行搜索。我想在我的数据层更具体地说是我的存储过程中实现这个逻辑。一种这样的方法是
if ( all four are empty)
select command
else if ( 3 are empty
select command
and so on...
有没有其他方法可以用更好的逻辑替换这些 IF 语句。简而言之,我希望仅根据用户提供的值进行搜索
如果您使用的是 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 不可行,它仍然是最佳选择。
您可以使用案例逻辑:
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
创建基本查询并基于 4 个输入值动态附加在 where 子句中。
您可能正在寻找如下内容
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 个条件的记录比匹配一个条件的记录更重要。
我现在无法访问数据库,所以下面的语法可能有点损坏,但原则上:
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