PreparedStatementとWHERE句の編集

The Backyard - PreparedStatementAndNull」より。

しかし,webアプリの検索フォームなどでは,プリペアドステートメントは使えない場合が多かった.検索条件項目が複数存在していて,いずれの項目も必須で無い場合,項目が入力されているかどうかをチェックし,それに合わせてSQL 文の WHERE 句の内容をツギハギしなければならないからだ.

SQLが3値論理であることを利用して部分部分で条件式を無効化することで、WHERE句の編集を回避しようという試み。

例)ユーザID,職業,年齢を条件として検索する.どれも必須項目でない.
SELECT *
FROM Table_Name
WHERE
(
      user_id = ?
  AND   profession = ?
  AND   age >= ?
  AND   age < ?
) IS NOT FALSE

ただし、値がnullの行があると条件を指定してても常に選択されてしまうというバグありとのこと。


上記の記事読んでて思いついたことのメモ。

WHERE句の編集回避、って点だけに絞って考えたら次のような感じでいけないかな。(SQLがどの時点でどういう風に最適化されるか知らないからなんともいえないけど)

SELECT *
FROM Table_Name
WHERE
       (? <> 0 AND user_id = ?)
  AND  (? <> 0 AND profession = ?)
  AND  (? <> 0 AND age >= ?)
  AND  (? <> 0 AND age < ?)