java.sql.PreparedStatement で 条件句に空文字があると面倒
例えば、DBのあるテーブルのSUB_NAMEというカラムがあったとする。
Oracleは ''(空文字列) を NULL として扱うので、SUB_NAME = '' という条件句は常にfalseとなる。
SUB_NAMEがNULLだとしてもfalseになる。NULLとの比較は常にfalse。
NULLの列を検索するには SUB_NAME is NULL という条件句にしなければならない。
なもんだから、Javaで代入する文字列が空文字かもしれない場合、
String sql = "select * from SYOHIN_MASTER where " ; if(StringUtils.isBlank(val)){ sql += "SUB_NAME is null" ; } else { sql += "SUB_NAME = ?" ; }
こんなことになるヽ(;´Д`)ノ
なんだか、where句自体を分けるのは手間もかかるしナンセンス。
プログラマとしてあるまじきコーディングだ。
そんな場合は、以下のようにwhere句をムリヤリ1個にまとめて書くことで解決。
sql += "SUB_NAME = ? or (? is null and SUB_NAME is null)" ;
スマートな記述方法なのかどうかは疑問(SQLの可読性が低いし)ですが、どうしても1文で書きたい場合に。