SQLでよく使う関数のひとつに concat や sum がありますが、どちらも引数に 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;
この場合、sales に null があっても、自動で除外されて合計されます。
問題になるケース
問題になるのは、sumの対象が複数の値を手動で足し合わせている場合です。
SELECT
SUM(value1 + value2 + value3) AS total
FROM
some_table;
このようにすると、value1〜value3のどれか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