2017-02-07 20 views
0

私は一日を費やしてこれに対する答えを探し、3つの異なる検索エンジンのバリエーションの後では不可能であるという事実に自分自身を解決しました。ここに私の問題がある。私はプリンタのモデル番号のテーブルを検索する必要があります。プリンタモデルは標準化されていないため、モデルのさまざまな部分が異なる注文になる可能性があります。SQL - 正確な単語の一致を任意の順序で検索

HP Officejetのプロ8715

HPのOfficejetの8715 Proの

の両方が明らかに同じプリンタですが、彼らは私たちとベンダーの間で共有DB内の両方の方法で現れます。 HP OfficeJet Pro 8715をで検索すると、HP OfficeJet 8715 Proも返されますが、HP OfficeJet Pro 8715dwなどは返されません。

要約すると、単語は任意の順序で指定できますが、単語は正確に一致する必要があります。

私はすでに検索文字列を#tempテーブルに解析しているので、各行に単語があり、結果を比較する方法です。

INSERT INTO #results 
    SELECT Make, Model 
    FROM tDevices 
     WHERE (Make LIKE '%' + @MAKE + '%') AND (Model LIKE '%' + @MODEL + '%') AND (Model LIKE '%' + @MODEL2 + '%') 

ここで、各モデル変数は、モデル内の別の単語です。これは素晴らしい作品が、返しHP Officejetの 8715プロだけでなくHP Officejetのプロ8715dwとして

これは可能ですか?

おかげ

+2

を使用しているDBMS? –

+0

'Make'が常に先頭にある場合、' Model'の単語順のすべての順列に対して明示的にチェックするだけですか? – shash678

+0

これを回答できますか?これは私たちのための最良のソリューションであった。 –

答えて

0

%(オペレータが)それをすることができますので、それは、8715dwを返します。 %sのなし

試してみてください(https://stackoverflow.com/a/14291100/510788に基づく)

INSERT INTO #results 
    SELECT Make, Model 
    FROM tDevices 
     WHERE (Make LIKE @MAKE) AND (Model LIKE @MODEL) AND (Model LIKE @MODEL2) 

更新:あなたは

SELECT * FROM 
    (SELECT Make, CONCAT(' ', REPLACE(Model,' ',' '), ' ') AS Model FROM tDevices) t 
WHERE 
    Make LIKE '%hp%' AND (
     Model LIKE '% 8715 %' OR 
     Model LIKE '% pro %' AND 
     (REPLACE(REPLACE(Model, 
     ' 8715 ',''), 
     ' pro ','')) = '' 
    ) 
+0

%sがなくても、モデルの位置は無視されなくなりました。 –

+0

はい、私はそれを考えていませんでした、申し訳ありません。より良い解決策を知りたい場合は、私のアップデートを参照してください。 –

+0

非常に興味深い。 (それは追加の単語が検索に含まれるように見えるので)問題全体を解決することはできませんが、私はあなたの意見を見て、クエリの最初の部分に必要なものです。ありがとうございました!私はそれを働かせ、答えを打ち明けるでしょう! –

関連する問題