SQL选择。。。哪里有替换-担心它';这是低效的
在SQL Server 2005中,我有一个如下所示的产品搜索:SQL选择。。。哪里有替换-担心它';这是低效的,sql,sql-server-2005,replace,Sql,Sql Server 2005,Replace,在SQL Server 2005中,我有一个如下所示的产品搜索: select ProductID, Name, Email from Product where Name = @Name 我被要求忽略Product.Name中的几个“特殊”字符,这样搜索“potatos”就会返回“pota toes”和“potatos”。我的第一个想法是这样做: select ProductID, Name, Email from Product where REPLACE(Name, '-', '')
select ProductID, Name, Email
from Product
where Name = @Name
我被要求忽略Product.Name中的几个“特殊”字符,这样搜索“potatos”就会返回“pota toes”和“potatos”。我的第一个想法是这样做:
select ProductID, Name, Email
from Product
where REPLACE(Name, '-', '') = @Name
…但仔细想想,我想知道对每个候选结果运行函数是否会降低性能。SQL是否有一些优化魔法可以帮助它快速完成这类事情?您能想出更简单的方法来满足我的要求吗?如果您愿意强制第一个字符按字母顺序排列,您可能会获得更好的性能,就像这样
select ProductID, Name, Email
from Product
where REPLACE(Name, '-', '') = @Name
And Name Like Left(@Name, 1) + '%'
如果名称列已编制索引,则可能会得到索引查找而不是扫描。缺点是,您不会返回值为“-po ta to es”的行,因为第一个字符不匹配。更多基于标准:您可以添加一个新列,例如,
searchable_name
,预先计算替换的结果(以及任何其他调整,例如SOUNDEX)在上插入/更新
并将其存储在新列中,然后根据该列进行搜索
较少基于标准:许多RDBMS提供了一个功能,您可以使用一个函数创建索引
;这通常称为函数索引。您的情况似乎非常适合这种功能
最强大/灵活:使用专用搜索工具,如Lucene。对于这种情况,这似乎有些过分,但它们是为搜索而设计的,并且大多数都提供了复杂的词干提取算法,几乎可以肯定地解决这个问题。您是否可以在产品表中添加一个字段,其中包含已删除特殊字符的产品名称的可搜索版本?然后,您可以对每条记录只执行一次“替换”,并对新字段进行有效搜索。您可能需要咬紧牙关。在产品搜索中忽略某些字符会增加大量复杂性。期待有任何好的解决方法!!在将字符串传递到存储过程之前,您能在代码中进行字符串替换吗?+1可能会有很大帮助,在我遇到这种情况时,第一个字符从来都不是特别的。虽然我不能将其作为我的“可接受”答案,但这种方法非常聪明,我正在将其放入我的技巧袋中。谢谢。我原以为新专栏写得过火了,但它能解决这么多问题。谢谢