SQL NULL 関数
1. SQL の COALESCE()、IFNULL()、ISNULL()、NVL() 関数
NULL値を伴う演算は、時として予期せぬ結果を引き起こすことがあります。
SQLにはNULL値を適切にハンドリングするための組み込み関数が用意されています。最も一般的な関数は以下の通りです。
- COALESCE() - 推奨される標準的な関数(MySQL、SQL Server、Oracleで動作)
- IFNULL() - (MySQL)
- ISNULL() - (SQL Server)
- NVL() - (Oracle)
- IsNull() - (MS Access)
注意: 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」カラムは任意入力(Optional)であるため、NULL値が含まれる可能性があります。
ここで、次のSQL文を見てみましょう。
SELECT ProductName, Price * (InStock + InOrder)
FROM Products;注意: 上記のSQLにおいて、「InOrder」の値がNULLである場合、計算結果(リザルト)もNULLになってしまいます。
3. COALESCE() 関数
COALESCE() 関数は、NULL値が発生する可能性がある場合に推奨される標準的な手法です。
この関数は、引数のリストの中で最初の非NULL値を返します。
COALESCE() 関数は MySQL、SQL Server、Oracle で動作します(MS Access では動作しません)。
3.1 構文
COALESCE(値1, 値2, ...., 値_n)ここでは COALESCE() 関数を使用して、NULL値を 0 に置換します。
SELECT ProductName, Price * (InStock + COALESCE(InOrder, 0))
FROM Products;4. IFNULL() 関数 (MySQL)
MySQL の IFNULL() 関数は、NULLを指定した値に置換します。
4.1 構文
IFNULL(式, 置換値)ここではNULL値を 0 に置換します。
SELECT ProductName, Price * (InStock + IFNULL(InOrder, 0))
FROM Products;5. ISNULL() 関数 (SQL Server)
SQL Server の ISNULL() 関数は、NULLを指定した値に置換します。
5.1 構文
ISNULL(式, 置換値)ここではNULL値を 0 に置換します。
SELECT ProductName, Price * (InStock + ISNULL(InOrder, 0))
FROM Products;6. NVL() 関数 (Oracle)
Oracle の NVL() 関数は、NULLを指定した値に置換します。
6.1 構文
NVL(式, 置換値)ここではNULL値を 0 に置換します。
SELECT ProductName, Price * (InStock + NVL(InOrder, 0))
FROM Products;7. IsNull() 関数 (MS Access)
MS Access の IsNull() 関数は、式がNULLであれば TRUE、そうでなければ FALSE を返します。
7.1 構文
IsNull(式)また、MS Access の IIf() 関数は、式の評価結果に応じて2つの値のいずれかを返します。
7.2 IIf の構文
IIf(式, 真の場合の値, 偽の場合の値)- 式 - 必須。評価する式。
- 真の場合の値 - 式が True の場合に返す値。
- 偽の場合の値 - 式が False の場合に返す値。
これらを組み合わせて、NULL値を 0 に置換する例は以下の通りです。
SELECT ProductName, Price * (InStock + IIf(IsNull(InOrder), 0, InOrder))
FROM Products;