0

私はこのような単語の配列を持っています:

$word1 = array('test1','test2','test3','test4','test5',...,'test20');

列にこれらの単語が少なくとも 1 つ含まれているすべての行をテーブルで検索する必要がありtextます。これまでのところ、次のSQLクエリがあります。

SELECT * FROM TABLE WHERE text LIKE '$word1[0]' OR text LIKE '$word1[1]' 
OR ... OR text LIKE '$word1[20]'

しかし、この設計はあまり効率的ではありません。where句のすべての単語を書き出す必要がないように、このクエリを短縮する方法はありますか?

SELECT * FROM TABLE WHERE text IN ($word1)

PS: これは私が探しているものの例であり、実行できる実際のクエリではありません。

4

4 に答える 4

0

1つの解決策は次のとおりです。

  1. 必要に応じてワイルドカードを使用して、単語という列に検索された単語を含むテーブルをデータベースに作成します (例)。
  2. この種のリクエストを使用する

    SELECT * FROM TABLE, FILTER_TABLE WHERE TABLE.text LIKE FILTER_TABLE.word

于 2013-11-06T11:18:31.560 に答える
0

配列を宣言せずに、次のように SELECT を使用できます。

SELECT * FROM TABLE WHERE text IN ('test1', 'test2', 'test3', 'test4', 'test5')
于 2013-11-06T11:18:54.543 に答える
0

現時点では SQL Server 2008 にアクセスできず、SQLfiddle は調子が悪いようですが、テーブル値コンストラクターを使用して式をいくらか単純化できるようです。

SELECT * FROM test
JOIN (SELECT w FROM (VALUES('word1'), ('word2'), ('word3'), ('word4')) AS a(w)) a
  ON test.text LIKE '%'+a.w+'%';

...これは、値としてリストされている単語について、テスト テーブルのテキスト列を検索します。複数の単語が一致する行の重複が必要ない場合はDISTINCT、選択に a を追加するだけです。

大規模な検索を行う場合は、フルテキスト インデックス作成を検討することをお勧めします。LIKEこの方法で文字列内の単語を検索するクエリは、インデックスを使用せず、データが既にメモリ内にない限り、非常に遅くなる可能性が高いことに注意してください。 .

于 2013-11-06T11:37:25.677 に答える