在SQL Server索引中搜索单词
我需要介于全文搜索和索引搜索之间的内容:
我想在表格的一列中搜索文本(如果很重要的话,该列上也可能会有一个索引)。
问题是,我想搜索列中的单词,但是我不想匹配部分。
例如,我的列可能包含公司名称:
Mighty Muck Miller and Partners Inc.
男孩和黄油早餐公司
现在,如果我搜索" Miller",我想找到第一行。但是,如果我搜索" iller",我就不想找到它,因为没有以" iller"开头的单词。但是,搜索" Break"应找到" Boy&Butter Breakfast company",因为一个词的开头是" Break"。
所以,如果我尝试使用
WHERE BusinessName LIKE %Break%
它将找到太多点击。
有什么方法可以搜索用空格或者其他定界符分隔的单词?
(LINQ最好,普通的SQL也可以)
重要提示:到目前为止,空格不是唯一的分隔符!斜线,冒号,圆点,所有非字母数字字符都应考虑在内才能起作用!
解决方案
where BusinessName like 'Break%' -- to find if it is beginning with the word or BusinessName like '% Break%' -- to find if it contains the word anywhere but the beginning
WHERE BusinessName LIKE '% Break%'
我们提到LINQ,我们可以做类似的事情...
string myPattern = "% Break%"; var query = from b in Business where SqlMethods.Like(b.BusinessName, myPattern) select b;
注意,这使用了" System.Linq.Data.SqlClient"名称空间,该名称空间直接转换为" LIKE"运算符,而无需其他处理。
单词定界符将是很多:空格,制表符,行首,括号,句点,逗号,感叹号/问号等。因此,一种非常简单的解决方案是在WHERE子句中使用正则表达式。 (这将比仅对我们可能想到的每个可能的定界符进行"或者"运算要高效得多。)
自从我们提到LINQ,这里的文章描述了如何使用SQL Server进行高效的正则表达式查询。
就性能而言,像这样的复杂WHERE子句总是对我造成危险,因此,我绝对建议对最终结果进行基准测试,毕竟我们可能会决定为该列构建搜索索引。
编辑:看到我们编辑了问题。在编写正则表达式时,很容易让它使用任何非字母数字字符作为分隔符,即[^ 0-9a-zA-Z]或者\ W表示任何非单词字符,\ b表示任何单词边界, \ B表示任何非单词边界。或者,不匹配分隔符,而是匹配任何单词,即\ w +。这是另一个使用SQL Server进行正则表达式搜索的示例(比我们需要的复杂得多)。
SQL Server 2000或者更高版本。
SELECT * FROM dbo.TblBusinessNames WHERE BusinessName like '%[^A-z^0-9]Break%' -- In the middle of a sentence OR BusinessName like 'Break%' -- At the beginning of a sentence
LIKE的关键字参考:http://msdn.microsoft.com/zh-cn/library/aa933232(SQL.80).aspx
试试这个:
declare @vSearch nvarchar(100) set @vSearch = 'About' select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'