MySQL NULL 関数
1. MySQL COALESCE() と IFNULL() 関数の概要
NULL 値が含まれる演算を行うと、時に予期せぬ結果(全体が NULL になるなど)を招くことがあります。
MySQL には、これらの NULL 値を安全に処理するための組み込み関数が 2 つ用意されています。
COALESCE()IFNULL()
そもそも NULL 値とは、データベースのフィールドにおける「不明」または「欠損」しているデータを表すものです。それ自体が特定の値を持っているわけではなく、データが存在しないことを示すプレースホルダーとして機能します。
2. デモ用データベース
ここでは、以下の構成を持つ「Products(製品)」テーブルを例に進めます。
| PId | ProductName | Price | InStock | InOrder |
|---|---|---|---|---|
| 1 | Jarlsberg | 10.45 | 16 | 15 |
| 2 | Mascarpone | 32.56 | 23 | null |
| 3 | Gorgonzola | 15.67 | 9 | 20 |
「InOrder(発注中)」カラムはオプション(任意)項目であり、NULL 値が含まれる可能性があります。
ここで、以下の SQL 文を見てみましょう:
-- 製品名と、在庫数に発注数を加えた合計金額を計算します
SELECT ProductName, Price * (InStock + InOrder)
FROM Products; 注意: 上記の SQL では、InOrder の値が NULL である場合、計算結果全体も NULL になってしまいます。100円の製品が在庫ありでも、発注数が NULL だと合計金額が消えてしまう……これはエンジニアとしては避けたい挙動ですよね。
3. MySQL COALESCE() 関数
COALESCE() 関数は、NULL になる可能性のある値を扱う際の推奨される標準的な手法です。
この関数は、引数のリストの中から 最初の非 NULL 値(NULL ではない値) を返します。
3.1 COALESCE() の構文
COALESCE(値1, 値2, ...., 値n)以下は、COALESCE() を使用して NULL 値を 0 に置換する例です。
-- InOrder が NULL の場合、0 として計算に利用します
SELECT ProductName, Price * (InStock + COALESCE(InOrder, 0))
FROM Products;4. MySQL IFNULL() 関数
IFNULL() 関数は、指定された式が NULL の場合に別の値に置き換えます。
4.1 IFNULL() の構文
IFNULL(式, 置換する値)以下は、IFNULL() を使用して NULL を 0 に置換する例です。
-- InOrder が NULL であれば 0 を返します
SELECT ProductName, Price * (InStock + IFNULL(InOrder, 0))
FROM Products;