1

結果セットをフィルター処理するために使用する複数のパラメーター (場合によっては最大 7 または 8) を取るストアド プロシージャがあります。これらのパラメーターはオプションです (デフォルトNULL)。渡された NULL 以外の値はすべてフィルターで使用されます (つまり、 booleanandではなく booleanorです)。

これらのクエリは通常、次のようになります...

SELECT *
FROM [MyTable]
WHERE (@Param1 IS NULL OR (@Param1 IS NOT NULL AND [Field1] = @Param1))
      AND (@Param2 IS NULL OR (@Param2 IS NOT NULL AND [Field2] = @Param2))
      AND (@Param3 ...

これが非常に非効率的であることは承知していますが、パラメーターの数が多いため、それらを個々のクエリに分割することはできません。

代わりに、次のことを試しました...

SELECT *
FROM [MyTable]
WHERE [Field1] = ISNULL(@Param1, [Field1])
      AND [Field2] = ISNULL(@Param2, [Field2])
      AND [Field3] ...

ただし、フィールドに含まれている場合に問題が発生するNULLため、=演算子は機能しません。

複数の「フィルター」パラメーターを使用して単一のクエリを作成できるように、これを行う簡単で効率的な方法はありますか? 可能であれば、動的 SQL を使用しないことをお勧めします。

4

2 に答える 2

1

NULL各節で既にテスト済みなので、最初の SQL をこれまで単純化できます。

SELECT *
FROM [MyTable]
WHERE (@Param1 IS NULL OR [Field1] = @Param1)
      AND (@Param2 IS NULL OR [Field2] = @Param2)
      AND (@Param3 ...

これは必ずしも非効率的ではありません。大幅に異なる実行計画につながるパラメーターの組み合わせを日常的に渡す場合は、パラメーター スニッフィングの問題をチェックすることをお勧めします。

于 2012-09-11T16:22:09.477 に答える
0

「is null」を使用する代わりに、次の比較を行うことができます。

where coalesce(Field1, @Param1, '') = coalesce(@Param1, Field1, '') . . .

Field1 または @Param1 のいずれかに値がある場合、2 つの COALESCE はその値を返します。両方が NULL の場合にのみ、3 番目の引数に到達します。

たまたま任意の型に変換できる''ので、それもカバーされています。ただし、この関数を使用すると、索引のユーザーが排除される傾向があります。

于 2012-09-11T18:52:21.193 に答える