2016-05-08 10 views
0

データベースとしてSQL Server Compactを使用するアプリケーションがvb.netで構築されているため、フルテキストインデックスを使用できません。ここすべての単語を任意の順序で含む行を検索

が自分のデータの...

MainTable FIELD1

  1. A B C
  2. B G C
  3. X Y Z
  4. C P B

検索用語= B C

期待される成果 =検索語のいずれかの組み合わせ=行1、2、ここで

4は、私が現在やってんだよ...

私は配列に検索語B Cを置換しています%B%C%および%C%B%を含み、これらの値をtempTableのフィールド1に挿入します。

だから私のSQLは次のようになります。この単純な例では

SELECT * FROM MainTable INNER JOIN tempTable ON MainTable.field1 LIKE tempTable.field1

、それが正しく、期待される結果を返しません。しかし、私の検索語にはより多くの値を含めることができます。例えば、6つの検索語B C D E F Gが置換されると720の異なる値があり、より多くの検索語が使用されると、順列は指数関数的に増加する。

これを行うより良い方法はありますか?

+0

を私が把握することができます唯一の方法は、行にスペースからデータを分割することです、行のみが含まれます(=単語)をリストに入れ、あなたが探している単語の数でなければならない別個の値を計算します。恐らく大きなデータセットでは恐ろしく遅いでしょう:) –

+0

検索文字列( 'A B C D E F')を単一の列テーブル(' @ termTable')に変換すれば、何個の順列が存在するかは関係ありません。 ( ''% '+ t.term +'% ''のようにm.field1上のメインテーブルm内部結合@termTableから別名m。*を選択)別のアプローチ。 CLRアセンブリが可能な場合、カスタムランク付けを行うことができます。 –

+0

これは、 'ABCDEF'内の各検索語が任意のものに含まれている可能性があるため、 '%' + t.term + '%' 'のようなm.field1上の@termTable tは機能しませんデータの順序。 「B A F E D C」、「A X Y Z B C D E F」などとすることができ、それらの結果がすべて返されるようにします。 –

答えて

1

以下は、上記のあなたの例のために動作します:

Select * from table where field1 like '%[BC]%' 

しかし、それはまた、唯一の「B」または「C」を含む文字列を返します。あなたはどんな順序でも1つ以上でも両方の文字を必要としますか?

EDIT:その後、次の作業になります。

Select * from test_data where col1 LIKE '%Apple%' and col1 like '%Dog%' 

がここにデモを参照してください:http://rextester.com/edit/LNDQ49764

+0

結果には、どちらの順序でも含める必要があります –

+0

上記の例は非常にシンプルですが、私が 'Apple Dog'を探していて、データに' Apple Dog'、 'Dog Apple'、 「Apple Cat Dog」、「Dog House Car Apple Apple」...これらの4行すべてが返されたかった。 –

+0

上記の編集を参照してください。それは機能しますか? – mo2

関連する問題