次のように、すべての列をカバーする条件を記述するのではなく (オプションのフィルタリングを可能にする)、多くの列を持つテーブルをクエリするためのフィルター オブジェクトがあります。
WHERE ((:value0 IS NULL) OR (column_name0 = :value0)) AND ((:value1 IS NULL) OR (column_name1 = :value1)) AND... etc
列ごとに。代わりに、理想的には、フィールド名をパラメーターとして渡すことができるようにしたいと思います。
WHERE :column_name0 = :value0 AND column_name1 = :value1 AND... etc
解析時に列が必要なため、これは不可能です (この回答hereと同様)。
これをどのように克服しますか?-新しい列が追加または削除されたときにSQLを維持する必要はありません(最初の例で必要になるように)。列名をコマンド文字列に直接構築するのは危険だと思いますこれにより、SQL インジェクションが可能になる可能性があります。
このコードは Web サービスの背後にあることに注意してください。