社内SEの話

日々起きたことの記録用

【SQL】バインド変数で抽出する範囲を指定

↓プログラミングで副業を考えたらこちら↓

バインド変数で抽出範囲を制御する方法

バインド変数とは

docs.oracle.com

バインド変数は、クエリ内で直接値を埋め込むのではなく、変数としてバインドしてから実行します。

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を参考にしてみてはいかがでしょうか