Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择。。。哪里有替换-担心它';这是低效的_Sql_Sql Server 2005_Replace - Fatal编程技术网

SQL选择。。。哪里有替换-担心它';这是低效的

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, '-', '')

在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, '-', '') = @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可能会有很大帮助,在我遇到这种情况时,第一个字符从来都不是特别的。虽然我不能将其作为我的“可接受”答案,但这种方法非常聪明,我正在将其放入我的技巧袋中。谢谢。我原以为新专栏写得过火了,但它能解决这么多问题。谢谢