我的网站上有一个搜索选项,有4个搜索条件,并不是必须输入所有搜索条件。我想在我的数据层中实现这个逻辑,更具体地说是我的存储过程。一种这样的方法是
if ( all four are empty)
select command
else if ( 3 are empty
select command
and so on...
还有其他方法我可以用一些更好的逻辑替换这些IF语句。简而言之,我希望仅根据用户提供的值进行搜索
答案 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 ...
答案 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