SQL 包含问题
Posted
技术标签:
【中文标题】SQL 包含问题【英文标题】:SQL Contains Question 【发布时间】:2011-10-21 04:39:45 【问题描述】:谁能给我解释一下?我在下面有两个查询及其结果。
查询:
select * from tbl where contains([name], '"*he*" AND "*ca*"')
结果集:
赫兹租车
海明威的小酒馆
查询:
select * from tbl where contains([name], '"*he*" AND "*ar*"')
结果集:
什么都没有
第一个查询是我所期望的,但我希望第二个查询返回“Hertz Car Rental”。我是否从根本上误解了“*”在全文搜索中的工作原理?
谢谢!
【问题讨论】:
【参考方案1】:我认为 SQL Server 将您的字符串解释为 prefix_terms。星号不是普通的旧通配符说明符。全文和包含是面向单词的。对于您正在尝试做的事情,最好使用普通的旧 LIKE 而不是 CONTAINS。
http://msdn.microsoft.com/en-us/library/ms187787.aspx
【讨论】:
+1 '*' 通配符只能用于前缀匹配,第一个示例中必须忽略模式字符串中的第一个。 @hatchet 推荐 LIKE 来代替这种用法是正确的(或者如果你想要真正的“模糊”匹配,就把通配符放在一起?) 我想我从根本上误解了一切,不是吗。感谢大家的澄清。我想我们将只进行前缀搜索,因为我们已经确定 LIKE 的性能不够。【参考方案2】:"*" 仅用作后缀。如果使用它作为前缀,则无论如何都需要扫描表,并且索引是无用的。到时候你也可以这样做
Select * From Table Where (Name Like '%he%') And (Name Like '%ar%')
【讨论】:
【参考方案3】:我会尝试用 % 替换 * 来看看效果如何。
select * from tbl where contains([name], '"%he%" AND "%ar%"')
【讨论】:
那没有任何作用。 CONTAINS 不是 LIKE。%
vs *
似乎没有破坏第一个查询;为什么会搞砸第二个?以上是关于SQL 包含问题的主要内容,如果未能解决你的问题,请参考以下文章