データベースを扱っていると、必ずと言っていいほど直面するのが NULL値の扱い です。
PostgreSQLでは、このNULLを柔軟に処理できる便利な関数として COALESCE関数 が用意されています。
COALESCEは「最初にNULLでない値を返す」関数で、データ整形やレポート作成に欠かせない存在です。
読み方は「コウアレス」もしくは、「コアレス」です。わたしは何度見ても読み方忘れてしまいます。
COALESCE関数の基本構文
COALESCE(value1, value2, ..., valueN)
引数を左から順に評価し、最初にNULLでない値を返します。
すべての値がNULLであれば、結果もNULLになります。
実際には引数が2つで使用されるケースがほとんどです。使用例①を見てみましょう。
使用例①:NULLをデフォルト値に置き換える
たとえば顧客テーブルで住所がNULLの場合、「不明」と表示したい場合は以下のように書けます。
SELECT COALESCE(address, '不明') AS address_info
FROM customers;
このクエリでは、address
がNULLなら「不明」が返り、それ以外は元の住所が表示されます。
使用例②:複数列の優先順位をつけて値を取得する
顧客連絡先として、電話番号→メールアドレス→住所の順で優先して表示したい場合は次のように記述できます。
SELECT COALESCE(phone, email, address) AS contact_info
FROM customers;
左から順に評価されるため、電話番号がNULLでなければそれを返し、NULLなら次の候補をチェックしていきます。
実践例:売上データのNULL処理
売上データで「割引額」がNULLの場合、0として扱いたいケースを考えます。
SELECT product_name,
price - COALESCE(discount, 0) AS final_price
FROM sales;
このように、COALESCEを使うことで売上計算をスムーズに行えます。
COALESCEと似た関数(NVL, ISNULL)との違い
- NVL:Oracleで使用される同様の関数。PostgreSQLには存在しません。
- ISNULL:SQL Serverでよく使われる関数。2引数しか扱えないのに対し、COALESCEは複数引数を評価できます。
つまり、PostgreSQLでの標準的な方法は COALESCE一択 と覚えておくと良いでしょう。
注意点とパフォーマンスの観点
- 引数のデータ型はすべて揃えるのが基本です(異なる型だと暗黙的な型変換が発生します)。
- 大量データを処理する場合、複雑なCOALESCEはパフォーマンスに影響する可能性があります。
まとめ
- COALESCEは最初のNULLでない値を返す関数。
- NULLをデフォルト値に置き換えたり、複数列から優先順位をつけて値を取得できる。
- 他のDB関数との違いを理解すると、移植性の高いSQLを書ける。
PostgreSQLを使うなら必須の関数なので、ぜひ積極的に活用してみてください。
コメント