- - PR -
JDBC(バインド変数)について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-24 13:15
ご質問させて下さい。
今、JDBCを使用した開発を行っているのですが、 StringでSQLを作成する際、WHERE句で ----------------------------------------------- "WHERE "+ "CODE = ? "; ----------------------------------------------- とした場合、バインド変数として入れる変数がNULLのだったら、 自分では、そのWHEREはスルーされると 思っているのですが、スルーされないので悩んでしまっております。 比較演算記号がおかしいのでしょうか? 宜しくお願い致します。 | ||||||||||||
|
投稿日時: 2007-07-24 14:16
スルーというのが、WHERE句自体が消えた状態でSQLが発行される
ということでしたら、それはありません。 バインド値がnullの場合は、WHERE句ごと含めないようにするか、 どちらでも対応できるるSQLを用意する必要があります。 | ||||||||||||
|
投稿日時: 2007-07-24 14:20
FAQな回答をしておきます。
NULLを含む演算子の評価結果は一般的にNULLになるため、 WHEREの式が最終的に真とならない限り除外されます。 なので、SQL組み立ての時点で条件から除外するか、 ----------------------------------------------- WHERE (? IS NULL OR CODE = ?) ----------------------------------------------- として二つの?に同じ値をバインドすればよいです。 #OracleはNULLと''が等価な特殊仕様ですが、これは例外。 | ||||||||||||
|
投稿日時: 2007-07-24 14:21
小僧氏の返答で概ね言い尽くされていますね。
Java側でnull値をバインドした場合、DB側のNULL値扱いなのですが そもそもSQLの仕様でNULLとNULLを=で比較するとfalseになるので注意が必要です。 SQLではNULL値か比較する際にIS NULL演算になりますので。 なので、件のSQL文ではCODE = NULLの条件となり、 これは常に成り立たないので1件も対象とならないことになります。 このへんもDBの製品によって挙動が異なるんだったっけ? | ||||||||||||
|
投稿日時: 2007-07-24 14:48
確かJDBCドライバのバインド変数の仕様で決まっていたような気がします。 ただのSQLでNULLをイコールで比較できるDBはあったと思うんですけどね。 | ||||||||||||
|
投稿日時: 2007-07-24 15:33
ちょこっと補足。
正確にはfalseではなく、unknownになります。 「trueにならない」という意味では、実際には問題にならない誤解なんですが。
例えばPostgreSQLは"transform_null_equals"パラメータで挙動を変更できます。 あと、多分JDBC仕様ではカバーしていないエリアです。 | ||||||||||||
|
投稿日時: 2007-07-24 15:36
これの例を挙げておきます。 WHERE (CODE = ? OR ? IS NULL) 2回、同じ値をバインドして下さい。 追記:あしゅさんのコメント見落としてました・・・思いっきりかぶり。 [ メッセージ編集済み 編集者: カーニー 編集日時 2007-07-24 15:37 ] | ||||||||||||
|
投稿日時: 2007-07-24 15:42
なるほど。勉強になりました。 補足ありがとうございます。 |