我需要在全文搜索和索引搜索之间进行处理:
我想在我的表的一列中搜索文本(如果这很重要,也可能会在列上有一个索引。)
问题是,我想在列中搜索单词,但我不想匹配部分。
例如,我的专栏可能包含商家名称:
Mighty Muck Miller and Partners Inc.
男孩&黄油早餐公司
现在,如果我搜索“ Miller ”,我想找到第一行。但如果我搜索“ iller ”我不想找到它,因为没有以“iller”开头的单词。搜索“ Break ”应该找到“ Boy&amp; Butter Breakfast company ”,因为有一个词以“ Break ”开头。< / p>
所以,如果我尝试使用
WHERE BusinessName LIKE %Break%
会发现太多点击。
有没有办法搜索由空格或其他分隔符分隔的单词?
(LINQ将是最好的,纯SQL也会这样做)
重要提示:空间不是唯一的分隔符!为了实现这一点,应考虑使用斜杠,冒号,圆点,所有非字母数字字符!
答案 0 :(得分:6)
你的单词分隔符将很多:空格,制表符,行首,括号,句点,逗号,感叹号/问号等。因此,一个非常简单的解决方案是在WHERE子句中使用正则表达式。 (而且它可以比你想到的每个可能的分隔符OR更高效。)
由于您提到了LINQ,这里有一篇介绍如何efficient regex querying with SQL Server。
的文章就性能而言,像这样复杂的WHERE子句总是会引发一个红旗,所以我绝对建议你最终得到什么样的基准测试,你可能决定为这个列建立一个搜索索引。
编辑:看到您编辑了问题。当writing your regex时,很容易让它使用任何非alphanum字符作为分隔符,即[^ 0-9a-zA-Z],或者对于任何非单词字符使用\ W,对于任何单词都使用\ b边界和\ B表示任何非字边界。或者,不是匹配分隔符,只匹配任何单词,即\ w +。这是another example某人使用SQL Server进行正则表达式搜索(比您需要的更复杂)。
答案 1 :(得分:4)
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
答案 2 :(得分:3)
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/en-us/library/aa933232(SQL.80).aspx
答案 3 :(得分:1)
WHERE BusinessName LIKE '% Break%'
答案 4 :(得分:1)
你提到过LINQ - 你可以做点像......
string myPattern = "% Break%";
var query =
from b in Business
where SqlMethods.Like(b.BusinessName, myPattern)
select b;
请注意,这会使用System.Linq.Data.SqlClient
命名空间,该命名空间直接转换为LIKE
运算符,无需额外处理。
答案 5 :(得分:0)
试试这个:
declare @vSearch nvarchar(100)
set @vSearch = 'About'
select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'