6

我需要介于全文搜索和索引搜索之间的东西:
我想在表格的一列中搜索文本(如果重要的话,该列上也可能会有一个索引)。

问题是,我想在列中搜索单词,但我不想匹配部分。

例如,我的专栏可能包含公司名称:
Mighty Muck Miller and Partners Inc.
Boy & Butter Breakfast company

现在,如果我搜索“ Miller ”,我想找到第一行。但是如果我搜索“ iller ”我不想找到它,因为没有以“iller”开头的单词。但是,搜索“ Break ”应该会找到“ Boy & Butter Breakfast company ”,因为有一个词以“ Break ”开头。

所以如果我尝试使用

WHERE BusinessName LIKE %Break%

它会发现太多的点击。

有没有办法搜索由空格或其他分隔符分隔的单词?

(LINQ 最好,纯 SQL 也可以)

重要提示:到目前为止,空格并不是唯一的分隔符!应该考虑使用斜线、冒号、点、所有非字母数字字符!

4

6 回答 6

6

您的单词分隔符会很多:空格、制表符、行首、括号、句点、逗号、感叹号/问号等。因此,一个非常简单的解决方案是在 WHERE 子句中使用正则表达式。(而且它会比对你能想到的所有可能的分隔符进行 ORing 更有效率。)

既然您提到了 LINQ,这里有一篇文章描述了如何使用 SQL Server 进行高效的正则表达式查询

就性能而言,像这样复杂的 WHERE 子句总是向我提出一个危险信号,所以我绝对建议对你最终得到的任何东西进行基准测试,毕竟你可能决定为该列建立一个搜索索引。

编辑:看到你编辑了你的问题。在编写正则表达式时,很容易让它使用任何非字母字符作为分隔符,即 [^0-9a-zA-Z],或 \W 用于任何非单词字符,\b 用于任何单词边界和\B 用于任何非单词边界。或者,不匹配分隔符,只匹配任何单词,即 \w+。这是另一个使用 SQL Server 进行正则表达式搜索的示例(比您需要的更复杂)。

于 2008-10-01T10:36:49.067 回答
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
于 2008-10-01T10:18:47.300 回答
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

于 2008-10-02T02:19:08.707 回答
1
WHERE BusinessName LIKE '% Break%'
于 2008-10-01T10:18:57.347 回答
1

你提到了 LINQ - 你可以做类似的事情......

string myPattern = "% Break%";

var query =
      from b in Business
      where SqlMethods.Like(b.BusinessName, myPattern) 
      select b;

请注意,这使用System.Linq.Data.SqlClient直接转换为LIKE运算符的命名空间,无需额外处理。

于 2008-10-01T10:35:12.470 回答
0

试试这个:

declare @vSearch nvarchar(100)

set @vSearch = 'About'

select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'
于 2010-03-09T15:51:47.427 回答