SQLiteで集計する時のちょっとした落とし穴
こんばんは。
あと4分でまたも日付が変わっちゃうのでアレしなきゃいけない時間になりました。
残念。
今日はSQLiteの小話。
SQLiteで数値の集計を行う場合、集計用の関数としてSUM()とTOTAL()があります。
細かい説明はhttp://www.dbonline.jp/sqlite/function/index2.htmlこちらにゆずるとして
ポイントはSUMはNULLを返す可能性があり、TOTALは集計対象が無かった場合に0.0を返してくれると言うところです。
例えば
SELECT SUM(a.tama) as SUM_RET,TOTAL(a.tama) as TOTAL_RET FROM OCNCN a WHERE sex = 'f'
こんなSQLがあったとして結果は
SUM_RET = NULL
TOTAL_RET = 0.0
みたいに返ってきます。
今、対面してるiOSアプリのバグとして集計対象が無かった場合にゲロ吐いて落ちちゃう
って言う悲しい事態(※)に遭遇したワケですが、対処として一旦はResultSetから抜き出した値を
if(nanchara != nil)でフィルタして逃げようと画策していました。
よくよく調べてみりゃ冒頭の通り、集計をTOTALで処理しSQL側で対処してやれば、
そもそもif文で無駄にフィルタをかます必要もなく、あとあとのロジックを変更→テストする必要もないので
コチラがお得と言う事に気づきました。えへ。
※ 集計結果をNSDecimalNumberのdecimalNumberWithStringに渡してたおかげで悲しい事態になり、その後の処理でズドン。