バインド変数で抽出範囲を制御する方法
バインド変数とは
バインド変数は、クエリ内で直接値を埋め込むのではなく、変数としてバインドしてから実行します。
SELECT * FROM employees WHERE department_id = :dept_id;
利点
・再利用性:同じクエリを異なる値で何度も実行できます。
・パフォーマンスの向上:データベースはクエリの実行計画を事前に準備でき、実行速度が向上します。また開発中のデバッグ作業時に、容易に値の変更が出くるので開発パフォーマンスも向上します。
・SQLインジェクションの防止:外部からの入力をクエリに埋め込むことなく、SQLインジェクション攻撃からデータベースを守ることができます。
システムでSQL生成は極力避ける
SQLをシステムに組み込みたいときに、バインド変数で抽出する範囲を指定したくなるときがあります。
今回は帳票を出力させる場面でこの問題に遭遇しました。
ユーザに帳票番号とデータ登録日を入力させ、一致したデータを帳票として表示させます。
このときに帳票番号が指定されていれば単票が表示され、空等の場合は登録日の全データが表示される仕様でした。
システム側でSQLを生成する方法も考えられますが、その場合だとSQLのデータデバッグが大変になります。
SQL側で与える変数で結果を分けたいです。
個人的な考えですが保守性が著しく悪いので、極力SQLはシステムでは作成させないように心がけています。
その方法について解説します。
select 帳票番号 ,登録日 from テーブル where 登録日 = :日付 and (帳票番号 = :番号 or :番号 is null)
こうすると帳票番号がある時は帳票番号が呼び出され、空の場合は登録日の全データが表示されます。
今回はデータの仕様で登録日が入力必須だったので、登録日がありますが、データ次第ではもう少しスリムなSQLにできるようになります。
ここから先については上SQLを参考にしてみてはいかがでしょうか