6

全文検索とインデックス検索の間に何かが必要です:
テーブルの 1 つの列でテキストを検索したい (問題があれば、おそらくその列にもインデックスがあるでしょう)。

問題は、列内の単語を検索したいのですが、パーツを一致させたくないということです。

たとえば、私の列には、
Mighty Muck Miller and Partners Inc.
Boy & Butter Breakfast companyという会社名が含まれているとします。

Miller」を検索すると、最初の行が表示されます。しかし、「iller」で検索すると、「iller」で始まる単語がないため、検索したくありません。ただし、 「Break 」で検索すると、「 Boy & Butter Breakfast company 」が見つかるはずです。これは、「 Break 」で始まる単語が 1 つあるためです。

だから私が試してみると

WHERE BusinessName LIKE %Break%

あまりにも多くのヒットが見つかります。

空白やその他の区切り文字で区切られた単語を検索する方法はありますか?

(LINQ が最適です。プレーン SQL も同様です)

重要:区切り文字はスペースだけではありません! これが機能するには、スラッシュ、コロン、ドット、英数字以外のすべての文字を考慮する必要があります。

4

6 に答える 6

6

単語の区切り文字は、スペース、タブ、行頭、括弧、ピリオド、コンマ、感嘆符/疑問符など、多くなります。したがって、非常に簡単な解決策は、WHERE 句で正規表現を使用することです。(そして、考えられるすべての可能な区切り文字を単に OR するよりもはるかに効率的です。)

LINQ について言及したので、SQL Server で効率的な正規表現クエリを実行する方法を説明する記事を次に示します。

このような複雑な WHERE 句は、パフォーマンスに関する限り、常に危険信号を発します。そのため、結果が何であれ、ベンチマークを実行することをお勧めします。結局、列の検索インデックスを作成することになるかもしれません。

編集:質問を編集したのを見ました。正規表現を書くとき、英数字以外の文字を区切り文字として使用するのは簡単です.単語以外の境界の場合は \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 に答える