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