使用SQL Server,我有一个存储过程,我想让字符串搜索可选。
@search
是一个参数。如果@search
有值我要搜索字符串,否则如果它是空的,它应该绕过搜索。
我只想知道您对在WHERE中编写可选字符串搜索的最佳方式的看法。
现在我把它作为
AND (@search = '' OR [t4].number like '%'+@search+'%')
但是,我无法找到的是,即使@search = ''
成立也是如此评估
如果它仍然比较OR的两侧,那么我正在考虑使用这个
AND (CASE WHEN @search = '' THEN 1
ELSE (CASE WHEN [t4].number like '%'+@search+'%' THEN 1
ELSE 0 END) END) = 1
编辑:我做了几次测试,看起来案例的读取次数较少。
答案 0 :(得分:2)
我不确定它如何与LIKE
一起使用,但我目前最喜欢的表达方式是:
select * from
mytable
where myfield = COALESCE(@optionalValue, myfield)
如果@optionalValue
为空,则评估结果为myfield = myfield
,否则myfield
会针对@optionalValue
进行检查。
编辑:您可以说:
select * from
mytable
where myfield like ('%' + COALESCE(@optionalValue, myfield) + '%' )
它似乎工作正常。
答案 1 :(得分:2)
表达式通常从左到右进行评估,但并不能保证始终如此。您可以使用括号帮助控制订单,但执行计划将取决于许多其他因素。
但是,将varchar
字段与'%%'
与LIKE
进行比较,无论如何都会匹配所有内容。
答案 2 :(得分:1)
但是我无法发现的是,即使是这样的话也会检查 @search =''是真的
检查下面的示例,如果它是空的则通过搜索,否则它将执行搜索......
create table #temp
(
dat smalldatetime,
Solution_ID int,
stri varchar(100)
)
insert into #temp(dat, Solution_ID, stri)values(GETDATE(), 1, '')
insert into #temp(dat, Solution_ID, stri)values(GETDATE()+1, 2, 'ed')
insert into #temp(dat, Solution_ID, stri)values(GETDATE()+2, 3, 'edede')
select * from #temp
where myfield like '%' + coalesce(@searchString, myfield) + '%'
drop table #temp
您可以考虑在不会扫描整个表的列上添加非聚集索引,因为它在页面底部具有索引优势,其中包含所有记录的地址Non ClusteredIndex => Refernce
答案 3 :(得分:1)
您(大部分)可以安全地在CASE
语句中进行短路评估,但不能在第一种类型的语句中进行短路评估。
This article向您显示至少一个边缘情况,偶数CASE
短路失败。