日付や値の範囲を指定して検索する画面って良くあると思うんですが、
例えばそういう画面の入力値からSQL文を作成する際に以下のような仕様のものが多いと思います。
・下限だけが入力されてたら下限値以上(以降)の値を持つデータ、上限値のでの絞り込みは行わない
・上限だけが入力されてたら上限値以上(以前)の値を持つデータ、下限値のでの絞り込みは行わない
この時のSQL文をプログラム中で文字列の結合などで作成してるのならば未入力のときにWHERE句からバッサリ削るとかできるのですが、ソース中にSQLを直に書くのはあまりよろしくないみたいですし、
バインド変数を使ってやる場合はどのような方法でやるべきなんでしょうか。
今まではNULLだったら理論上の最小値や最大値をバインドしたりとか、
以下のような感じでCASE文とかを使ってNULLだったらTRUEを返したりしてました(@from_date、@to_dateの部分はバインド変数です)。
SELECT
id,val1,val2,val3,create_date
FROM
tbl1
WHERE 1 = 1
AND (CASE WHEN @from_date IS NOT NULL THEN date >= @from_date ELSE 1 = 1 END)
AND (CASE WHEN @to_date IS NOT NULL THEN date <= @to_date ELSE 1 = 1 END)
ただ、このやり方ってたぶんイマイチなんだろうなとなんとなく思ってたりします。
一般的にはどのように実現するものなのでしょうか。
回答2件
あなたの回答
tips
プレビュー