プログラマ38の日記

主にプログラムメモです。

SQL: よくやってしまう間違い(割り算や型変換)

気を抜くとすぐ忘れてしまうのでメモ。(メモしたから忘れないわけではないですが)

書き方の例でnullif関数を使っていますが、適宜データベースで用意されている関数に置き換えが必要です。

SQLの割り算では分母が0の時はnullに変換する

0除算エラーの対策です。もちろん固定値で割る場合は不要なのですが、項目の値や、集計値で除算する際には必須です。

--f2に0が入っていてもエラーを発生させないようにする
select f1 / nullif(f2, 0) from sample

 

数値や日付の変換では、空文字はnullに変換する

--f3に空文字が入っていてもエラーを発生させないようにする
select cast( nullif(f3,'') as decimal(18,0) ) from sample
select cast( nullif(f4,'') as date ) from sample

 

OracleJDBCでTimestamp型をgetObjectで取得しない

JDBCのResultsetで、getObjectはとても便利で、select結果の型に応じた項目値を返却してくれます。ですが、OracleのTimestamp型をgetObjectすると、java.sql.Timestampではなく、oracle.sql.TIMESTAMPが返却されてくるので、うっかりjava.sql.Timestampにキャストするとエラーになります。

きちんとgetTimestampを使って取得する必要があります。

 

私事

Oracleは、日付型の実装はしないんですかね。

Dateの項目を検索する際に、trunc(datefield) とかをやるくらいなら、日付型があれば便利だと思います。インデックスとかも使いやすくなりますし。

VARCHAR2とかあるので、DATE2とかで作ってくれてもいいのになーとか思いました。