2016-05-18 5 views
0

を含むCASEを使用してWHERE私のような何か書き込もうとしています:短絡CONTAINS

SELECT Id FROM SomeTable 
WHERE 
CASE WHEN (@param IS NULL) THEN 
    1 
ELSE 
    CONTAINS([FullText],@param) 
END = 1 

を、私は、構文文句ないようにSQL Serverのように見えることはできません。 CONTAINS検索を短絡するためにCASEを使用する方法はありますか?

はさえ、短絡していないようです。このような何かをやって:あなたは実行計画を見ればあなたが caseは、両方の部分が実行されている if... elseのシリーズに翻訳されていることがわかります

 CASE WHEN (@param IS NULL) THEN 
      1 
     ELSE 
      (CASE WHEN CONTAINS([FullText], @param) THEN 
       1 
      ELSE 
       0 
      END) 
     END = 1 
+2

[SQL WHERE句は短絡していますか?](http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated) – naomik

+0

の '文が左から右に評価されるので、「OR」は十分でなければならない(例えば、 '@param IS NULLまたはCONTAINS([FullText]、@ param)') – Anthony

+0

@Anthony Nope;リンクされた質問を参照してください。 –

答えて

1


望ましくない部分の実行を回避するための唯一の方法は

if @param is null 
    select * from myTable 
else 
    select * from myTable 
    where <expensive condition check> 
+0

残念ながら私の特定のシナリオでは「IF」は使用できません。 –

1

ちょうどあなたのクエリを簡素化しているように思え:

SELECT Id FROM SomeTable 
WHERE @param IS NULL OR CONTAINS([FullText],@param) 

ので@paramがNULLであれば、それは(第二の条件のための短絡をチェックしません。 )

+0

SQL Serverは短絡動作を保証しません。照会のCONTAINSがヌル述部エラーをスローします。 –

+0

@ Mr.SmithあなたはSQLのフィドルを提供できますか?この記事で、述語エラーの処理方法を見てみましょう。http://stackoverflow.com/questions/9216608/is-full-text-search-contains-clause-always-evaluatedクエリは、 'contains'関数のいくつかのマイナーなバリデーションを追加するだけで問題ありません – Sherlock

0

SQL Serverは短絡状態を保証しないため、次のようにしてNULL述語エラーを回避できます。

SELECT Id 
FROM SomeTable 
WHERE @param IS NULL 
OR CONTAINS([FullText], ISNULL(@param, 'a')) 

このように、@paramがnullの場合、エラーは発生しません。ただし、短絡状態がないと、おそらくwhere節の両方の部分が評価され、それには時間がかかる可能性があることを意味します。