2

現在、パラメータ検索文字列の受信に基づいて設定されたSQLストアドプロシージャがあります(たとえば、「Netgear WiFI Switch」)。ストアドプロシージャは、この.ieに対してワイルドカードのような検索を実行します。

WHERE COL1 LIKE '%Netgear WiFi Switch'%

これは問題なく機能しますが、任意の単語を検索してこれについて詳しく説明したいと思います。たとえば、クエリの例では、順序が異なるため、「NetgearSwitchWiFi」という製品を見逃します。

したがって、単語を分割して、各単語に対してワイルドカード検索を実行する必要があります。(%Netgear%AND%Switch%AND%WiFi%)

したがって、私の質問は、文字列を必要な単語に分割する方法を検討し、これらを変数に適用してから、検索文字列の分割から作成された変数の数に基づいて動的WHEREを実行する方法です。

ありがとうございました

4

3 に答える 3

2

SQLServerの全文検索を使用できます。非常に簡単で効率的です。全文検索を有効にしたくない場合は、次のクエリを使用して、アプローチ方法の基本的なアイデアを得ることができます。

DECLARE @keyword varchar(100)='Project'
-- remove double spaces
 while CHARINDEX('  ',@keyword) > 1            
  begin            
     SET @keyword=REPLACE(@keyword,'  ',' ')            
  end   
SET @keyword=REPLACE(@keyword,' ','%'' AND COL1 LIKE ''%')+'%'''
DECLARE @str varchar(max)=''
SET @str='SELECT  COL1 FROM dbo.table 
WHERE COL1 Like ''%'+ @keyword

EXEC (@str)

execの代わりにexecute_sqlを使用できます

于 2012-11-05T19:23:41.427 に答える
0

そのフレーズ(単語のセット)を取得してスペースで分割し、アルゴリズムに基づいてその列のテキスト値を検索するt-sql関数を作成します。このようにして、ロジックをwhere句に埋め込むことができます。これは抽象化されているため、関数はコードの他の領域で再利用できます。

これは単純な検索で機能する場合があります。複数の単語を検索するのは難しい場合があり、ハードコードされた検索が必要になります。関数は行の反復ごとに評価されるため、インデックスは機能しません。

于 2012-11-05T13:35:29.607 に答える
-1

検索にはLuceneまたはSolrを使用することをお勧めします。これらは、テキストインデックスを使用してこれらの単語の組み合わせを処理する際に、SQLクエリを使用するよりもはるかに効率的です。それでもSQLでテキストを検索する場合は、ブール検索を使用することをお勧めします。

ブール全文検索

文字列をいくつかの単語トークンに分割できます。次に、すべての一般的な単語(2文字以下、または「for」、「with」などの非常に一般的な単語)を削除できます。その後、クエリに+または-演算子を使用できます。もう1つの最適化は、一般的に検索されるフレーズを保存することです。しかし、それはおそらくあなたの質問の範囲外です。それが役に立てば幸い :)

于 2012-11-05T12:27:06.230 に答える