【SQLメモ】nullが1つでもあると、concatやsumの結果はnullになる

さだちかの実務ログ

SQLでよく使う関数のひとつに concatsum がありますが、どちらも引数に null が含まれていると、結果が null になることがあります。
一見うまく動いているようで、よく見ると値が返っていない…そんな時は、null が原因になっていないかを疑うと早く解決できるかもしれません。

concat編:nullがあると文字列が結合されない

例えば、以下のようなクエリ。

SELECT CONCAT('A', 'B', NULL) AS result;

ぱっと見 "AB" になるかと思いきや、結果は null
null が混ざると、全体の結果がnullになるのが concat の仕様です。

対処法

IFNULL(または COALESCE)を使って、nullを空文字に置き換えます。

SELECT CONCAT('A', 'B', IFNULL(NULL, '')) AS result;

sum編:nullがあると集計できない

sum も同様で、合計したいカラムの中に null があると、期待した結果にならないことがあります。

通常の集計(GROUP BY など)では、null は無視される仕様なので、以下のようなケースでは問題になりません。

SELECT
category,
SUM(sales) AS total_sales
FROM
sales_table
GROUP BY
category;

この場合、salesnull があっても、自動で除外されて合計されます。

問題になるケース

問題になるのは、sumの対象が複数の値を手動で足し合わせている場合です。

SELECT
SUM(value1 + value2 + value3) AS total
FROM
some_table;

このようにすると、value1value3のどれか1つでも null があると、加算結果全体が null になってしまいます。

対処法

やはり IFNULL を使って、nullを0に変換しておきます。

SELECT
SUM(IFNULL(value1, 0) + IFNULL(value2, 0) + IFNULL(value3, 0)) AS total
FROM
some_table;

まとめ

  • concat('A', NULL, 'B')null になる
  • 複数のカラムを + で加算すると、どれかが null なら全体が null になる
  • 対処法は IFNULL(x, '')IFNULL(x, 0)null を置き換える

SQLで思った通りに値が返ってこない時、意外と null が原因のことも多いです。
何かおかしいと思ったら、まずは null の存在を確認してみるのがよさそうです。

Comment