2009-07-08 16 views
1

私はかなり複雑なストアドプロシージャを使って画像ライブラリを検索しています。MS-SQL 2005検索:条件付きwhere節with freetext

私はビューを照会するためにビューを使用して動的SQLを書くつもりだったが、私は、フルテキストインデックスを使用する必要がある、と私の見解は、外側がそう(MS-SQL 2005 full-text index on a view with outer joins

に参加する必要があり、私は戻ってよストアドプロシージャ私は(すべてオプション)を検索する必要が

  • フルテキストインデックス(または全く検索用語)を使用して、一般的な検索クエリ
  • 1つ以上のカテゴリ(またはnone)
  • 単一のタグ(またはなし)

'WHERE'節に条件付きFREETEXTを行う方法はありますか?クエリは空の場合があります。その場合は、これを無視するか、すべてのFTIの一致を返すだけです。

... AND FREETEXT(dbo.MediaLibraryCultures.*, '"* "')が動作していないようです。 case文がここでどのように機能するかは不明です。

一時的なテーブル/テーブル変数にカテゴリ/タグのフィルタ結果を挿入し、FTI検索結果に参加する方が良いですか?こうすることで、検索条件が指定されている場合にのみ結合を行うことができます。

思考?

+0

タグの選択にもっと注意を払ってください。 'sql-server' outnumbers 'mssql' 6000:1 –

+0

ありがとうございました。これらの重複タグを統合して削除するといいでしょう... – ScottE

答えて

0

ええと、私はSQLサーバーに短絡がないと思いましたか?

AND (@q = '' OR FREETEXT(dbo.MediaLibraryCultures.*, @q)) 

はうまくいくようです!

奇妙なことに、奇妙なことに、フルテキストスキャンはまだ実行計画の一部です。

+0

興味深いことに、フルテキスト検索が実行計画に含まれています。クエリオプティマイザは、@qと ''両方を定数とみなし、全体のチェックを除外することになりました(短絡を無関係にすることは、最終的なクエリ)しかし、クエリは、オプティマイザがこれを仮定することができない各行の変数に影響する可能性があるので、私は推測します。私はまた、実行計画の全文検索に時間がかかるのかどうかを調べることに興味がありますか? これが実行している回答の場合は、それを受け入れられた回答としてマークしてください。 – Tetraneutron

+0

私はまた、SQLが短絡しないかどうかを確認するために少しテストを実行し、結果は少し混乱している テーブル#tempShort(int)を作成 は、(1/0)> 1 は#SELECT * FROM #tempShortから選択* (1/0)> 1または1 = 1 ドロップテーブル#tempShort 短絡した場合は、最初と3番目が期待されます。 2番目と3番目の両方で成功するが、2番目と3番目の両方が成功すれば、どんな結論を引き出すかを選択する。 – Tetraneutron

+0

はい、私はこの答えに行くつもりです。まだ受け入れられているとは言えません.48時間待たなければなりません。実行計画は、@ qが空であるかどうかにかかわらず、ftiステップの時間が同じであることを示しました。しかし、私の場合、FTIは現在かなり小さいので、それは良いテストではありません。 – ScottE

0

あなたは

where ... 
AND (FREETEXT(dbo.MediaLibraryCultures.*, @FreeTextSearchFor) OR @FreeTextSearchFor = '') 

(私は検索はnullがそれらに渡されていないので、私は空の文字列と比較してるFREETEXT感を持っている)

のような空の検索文字列のチェックを追加することができます

検索する用語が空の場合、句全体はtrueと評価されるため、返された行には(この句による)制限は適用されません。オプティマイザが機能し、各行に対してその比較を実行しないと考えられます。

+0

いいえ、述語はnullでも空でもありません。 – ScottE

1

私はSQL Server 2008を使用していますし、

AND (@searchText = '' OR freetext(Name, @searchText)) 

を使用してショートにしようとしていると私はメッセージを受け取ることが一年後に知っているとSQLの新しいバージョンが、FYI ...

@searchText = ''を設定すると、「空文字列の空文字列」が表示されます。 2008年の何かが変わって、このケースでは短絡が働いていると思います。

+0

興味深い。ありがたいことに、2005年もまだ実行中です。 – ScottE

0

SQL Server 2014では機能しません。私は私のストアドプロシージャのいずれかで提案された短絡を試みましたが、それはFREETEXTの表現を評価し続けます。私が見つけた唯一の解決策は次のとおりです。

IF ISNULL(@Text, N'') = N'' SET @Text = N'""' 

SELECT ... 
    WHERE ... 
    AND (@Text = '""' OR FREETEXT([Data], @Text)