Where子句中的SQL条件字符串比较

时间:2012-01-26 16:48:54

标签: sql sql-server sql-server-2005 stored-procedures where-clause

使用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

编辑:我做了几次测试,看起来案例的读取次数较少。

4 个答案:

答案 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

enter image description here

您可以考虑在不会扫描整个表的列上添加非聚集索引,因为它在页面底部具有索引优势,其中包含所有记录的地址Non ClusteredIndex => Refernce

答案 3 :(得分:1)

您(大部分)可以安全地在CASE语句中进行短路评估,但不能在第一种类型的语句中进行短路评估。

This article向您显示至少一个边缘情况,偶数CASE短路失败。