SQLクエリでSUMを使っているのですが計算するデータがなかった場合にNULLが結果として返ってくることがあります。
例え計算するデータがなくても、結果は「0」として返ってきてほしいですよね?
テーブル作りからやり直し!とか言われても、引き継いだのってどうしようもないじゃん!
COALESCE関数を使用する
COALESCE関数は、引数を順番に評価しNULLだった場合は次の評価を返してくれる関数です。
引数は、何個でも設定する事ができます。
まずは、テーブル構成と一般的なSQLから…
# exampleテーブル id | name | price ----+------+------- 1 | A | 100 ----+------+------- 2 | B | 150 ----+------+------- 3 | C | NULL ----+------+------- 4 | D | NULL ----+------+------- 5 | E | 300 ----+------+------- 6 | NULL | NULL ----+------+-------
# 普通に書く SELECT SUM(price) FROM example; # 結果:550
使っているDBMSによっては結果がNULLになるみたいです。
MySQLでは、数字の入っている箇所のみを計算して結果が正しく返ってきました。
# NULLだけ取得する SELECT SUM(price) FROM example WHERE price is NULL; # 結果:NULL
NULLだけを取得すると結果には0ではなくNULLが入ってきました。
SUMしているのであればやはりどんな状況であろうと「0」が欲しい!と思うのが普通ですよね。
NULLの値を0で取得する
そこで出てくるのが「COALESCE関数」です。
これはどういう風に使うかと言うと…まずは見てください。
# NULLを0で取得する SELECT COALESCE(SUM(price), 0) FROM example WHERE price is NULL; # 結果:0
SUM関数をCOALESCE関数で閉じ込めてあげます。
次は、引数として0を設定してあげるだけです。
もちろん、0以外にも10などの違う数字でも大丈夫です。
ちょっと応用して、NULLの値を指定して計算させる
データとしてはNULLとして設定されているが、このNULLは100として固定して計算させたい!という場合のやり方です。
応用も何もないのですが…
# NULLだったら文字列で取得する SELECT SUM(COALESCE(price, 100)) FROM example; # 結果:850
NULLだったところを、100に設定して全てのpriceを計算してみました。
レコードを変更するのはちょっと…という場合に使えそうなテクニックですね!
引数は何個でも設定することが可能
冒頭で書きましたが、COALESCE関数は引数を何個も設定できます。
どういう事?と思いますが、左がダメだったら次は右、それがダメだったら右…というように処理をしてくれます。
2つのカラムを見てどちらもNULLだったら3つ目の引数を返すというように使えます。
# COALESCE関数の引数を複数設定 SELECT COALESCE(price, name, 9999) FROM example; # 結果 COALESCE(price, name, 9999) ----------------------------- 100 150 C D 300 9999
結果は、6番目のデータに「9999」という値が設定されました。
priceカラムを評価してNULLだったらnameカラムを評価してNULLだったら9999を返すという事になります。
NULLに悩まされていた人は是非使ってみてください!
コメント
[…] [SQL]SUMの結果がNULLになってしまう時の対処法 | イザ!WEB開発者の惚気 […]