SQL SELECT ... WHERE with REPLACE - 担心它效率低下

dno*_*ord 4 sql replace sql-server-2005

在SQL Server 2005中,我有一个产品搜索,如下所示:

select ProductID, Name, Email 
from Product
where Name = @Name
Run Code Online (Sandbox Code Playgroud)

我被要求忽略Product.Name中的几个"特殊"字符,以便搜索"Potatoes"返回"Po-ta-toes"以及"Potatoes".我的第一个想法是这样做:

select ProductID, Name, Email 
from Product
where REPLACE(Name, '-', '') = @Name
Run Code Online (Sandbox Code Playgroud)

......但是第二个想法,我想知道我是否通过在每个候选结果上运行一个函数来杀死性能.SQL有一些优化魔法可以帮助它快速完成这类工作吗?您能想到我能够尝试满足我的要求吗?

G M*_*ros 5

如果你愿意强迫第一个字符成为字母,你可能会获得更好的表现,就像这样......

select ProductID, Name, Email 
from Product
where REPLACE(Name, '-', '') = @Name
      And Name Like Left(@Name, 1) + '%'
Run Code Online (Sandbox Code Playgroud)

如果对name列进行索引,则可能会获得索引搜索而不是扫描.缺点是,您不会返回值为"-po-ta-to-es"的行,因为第一个字符不匹配.


Han*_*Gay 5

更多基于标准:您可以添加新列,例如,searchable_name预先计算REPLACE(以及任何其他调整,例如SOUNDEX)的结果INSERT/UPDATE并将其存储在新列中,然后搜索该列.

基于标准的较少:许多RDBMS提供了一个可以创建INDEX使用函数的功能; 这通常被称为功能索引.您的情况似乎非常适合这样的功能.

最强大/最灵活:使用Lucene等专用搜索工具.对于这种情况看起来似乎有些过分,但它们是专为搜索而设计的,而且大多数都提供了复杂的词干算法,几乎可以肯定地解决这个问题.