0Pricing
SQL Interview Prep · レッスン

COALESCE、NULLIF、ISNULL

デフォルト値への置換と、COALESCEとベンダー固有関数の違いを学びます。

「COALESCE、NULLIF、ISNULL」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。

NULLの値を置き換える

NULLを検出できるようになったので、次に身につけるべき面接スキルは、NULLを適切なデフォルト値に置き換えることです。このための移植性が高く標準的なツールがCOALESCEです。

これと併せて、特定の値をNULLに変換するという逆方向の処理を行うNULLIFや、候補者がCOALESCEと混同しやすいベンダー固有関数のISNULL(SQL Server)とIFNULL(MySQL)も学びます。

引数の数や戻り値の型など、それぞれの正確な違いを理解しているかは、面接でよく確認されるポイントです。

COALESCEの基礎

COALESCEは任意の数の引数を受け取り、左から右に調べて最初の非NULL値を返します。すべての引数がNULLの場合はNULLを返します。

ANSI標準であり、主要なすべてのデータベースで動作するため、デフォルトの回答として使うべき関数です。表示、計算、グループ化のための代替値を指定する際に使用してください。

-- Show 0 instead of NULL for missing bonuses
SELECT name, COALESCE(bonus, 0) AS bonus
FROM employees;

-- Multiple fallbacks, first non-NULL wins
SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;

COALESCEは短絡評価される

面接官が確認する細かな点として、COALESCEは概念上、引数を左から右へ評価し、最初の非NULL値で停止します。そのため、先に評価した式で値が確定すれば、後続の高コストな式は必要ありません。

実際には、エンジンによってはオプティマイザーが積極的に評価する場合もあるため、ゼロ除算のようなエラーを防ぐ目的でこの挙動に依存しないでください。ただし、どの値が採用されるかという左から右への優先順位は保証されます。

-- Prefer the manual override, else the computed value,
-- else a constant default
SELECT COALESCE(manual_price, list_price * 1.1, 9.99) AS price
FROM products;

COALESCEと結果のデータ型

微妙な落とし穴として、COALESCEの結果のデータ型は、最初の引数だけでなく、すべての引数を組み合わせた型の優先順位によって決まります。互換性のない型を混在させると、エラーや予期しない切り捨てが発生することがあります。

たとえば、整数型の列と文字列のデフォルト値に対するCOALESCEは、エンジンによっては失敗したり、暗黙的にキャストされたりします。面接官はこの点を使って、型について考慮できているかを確認します。

-- Risky: integer column with a string fallback
-- may error or force a cast depending on dialect
SELECT COALESCE(score, 'N/A') FROM tests;

-- Safer: keep the fallback type-compatible, or cast explicitly
SELECT COALESCE(CAST(score AS VARCHAR), 'N/A') FROM tests;

ISNULL (SQL Server) とCOALESCEの比較

SQL ServerにはISNULL(expr, replacement)があります。COALESCEに似ていますが、面接官が好んで比較する重要な違いがあります:

  • 引数の数:ISNULLはちょうど2つの引数を取り、COALESCEは複数の引数を取ります。
  • 戻り値の型:ISNULLは最初の引数の型を使用するため、replacementが切り捨てられることがあります。COALESCEは引数全体の型の優先順位を使用します。
  • 移植性:ISNULLはSQL Server専用ですが、COALESCEはANSI標準です。

声に出して伝える推奨方針は、移植性と予測可能な型付けのためにCOALESCEを優先することです。

-- SQL Server: ISNULL may truncate the replacement to
-- the first argument's type (e.g. CHAR(1))
SELECT ISNULL(code, 'UNKNOWN') FROM items;
-- If code is CHAR(1), 'UNKNOWN' becomes 'U'

-- COALESCE picks the wider type and keeps 'UNKNOWN'
SELECT COALESCE(code, 'UNKNOWN') FROM items;

IFNULLとNVL

他の方言には、それぞれ2引数の省略形があります:

  • MySQL / SQLite: IFNULL(expr, replacement)
  • Oracle: NVL(expr, replacement)。さらにthen/elseを切り替えるNVL2もあります

これら3つはすべて、2引数のCOALESCEと同じように動作します。MySQLやOracle固有の書き方を聞かれた場合はこれらを挙げ、それ以外ではCOALESCEを使ってください。

-- MySQL
SELECT IFNULL(bonus, 0) FROM employees;

-- Oracle
SELECT NVL(bonus, 0) FROM employees;
-- NVL2(bonus, 'has bonus', 'no bonus') -> if/else on NULL

NULLIF:逆方向の処理

NULLIF(a, b)はa = bのときNULLを返し、それ以外の場合はaを返します。これは意図的にNULLを生成する関数で、COALESCEとは逆の処理です。

最も有名な用途はゼロ除算の防止です。分母をNULLIF(denominator, 0)で囲むと、分母が0の場合に除数がNULLになり、エラーを発生させる代わりに除算全体がNULLを返します。

-- Avoid divide-by-zero: returns NULL instead of erroring
SELECT revenue / NULLIF(orders, 0) AS avg_order_value
FROM daily_stats;

-- NULLIF(5, 5) -> NULL
-- NULLIF(5, 3) -> 5

NULLIFとCOALESCEの組み合わせ

この2つは非常に相性がよく、組み合わせて使えます。面接でよく使われる1行の例は、「注文がない場合に0を表示する安全な除算」です。まずNULLIFでエラーを回避し、続いてCOALESCEで結果のNULLを置き換えます。

この簡潔なイディオムからは、エッジケースへの対応と表示用の値への置き換えを1つの式で行える習熟度が伝わります。

SELECT
  COALESCE(revenue / NULLIF(orders, 0), 0) AS avg_order_value
FROM daily_stats;

-- orders = 0 -> NULLIF gives NULL -> division gives NULL
-- -> COALESCE turns it into 0

空文字列をNULLとして扱う

NULLIFのもう1つの実用的な用途は、空文字列をNULLにまとめ、すべて同じようにCOALESCEで処理できるようにすることです。汚れたデータではNULLと''が混在することが多いため、これによって両方を正規化できます。

このパターンは「値が空ならNULLにし、その後デフォルト値に切り替える」と読めます。「空欄と欠損値を同じように扱うにはどうしますか」という質問への、明確で移植性の高い回答です。

-- Treat both '' and NULL as missing, default to 'Anonymous'
SELECT COALESCE(NULLIF(TRIM(username), ''), 'Anonymous')
FROM users;

発展例:JOINをまたいだCOALESCE

LEFT JOINの後では、一致しなかった行の右側にNULLが生成されます。COALESCEを使うと、出力上のそれらのNULLを意味のあるデフォルト値に変換できます。これはレポート作成で非常によくある要件です。

ここでは、LEFT JOINのおかげで注文のない顧客も表示され、その合計がNULLではなく0になります。COALESCEがJOINの内部ではなくJOINの後に実行されると説明できれば、評価順序を理解していることが伝わります。

SELECT
  c.name,
  COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Customers with no orders get 0 instead of NULL

面接でのポイント

値の置き換えに使うツールのまとめ:

  • COALESCE(a, b, ...):最初の非NULL値を返します。複数引数に対応し、ANSI標準で、型は優先順位によって決まります。デフォルトの選択肢です。
  • ISNULL / IFNULL / NVL:2引数のベンダー固有の省略形です。ISNULLでは最初の引数の型に合わせて切り捨てが発生することがあります。
  • NULLIF(a, b):等しい場合にNULLを返します。ゼロ除算の防止や空欄の正規化に適しています。
  • 安全で表示しやすい除算には、COALESCE(x / NULLIF(y, 0), 0)を組み合わせてください。

まずCOALESCEを示し、方言が決まっている場合にだけベンダー固有のバリエーションに言及してください。

確認問題

安全な除算の式を選んでください。

まとめ

これでNULLを置き換えたり生成したりできるようになりました:

  • COALESCEは複数の引数から最初の非NULL値を返します。移植性の高いデフォルトの選択肢です。
  • ISNULL(SQL Server)、IFNULL(MySQL)、NVL(Oracle)は2引数の省略形です。ISNULLでは最初の引数の型に合わせて切り捨てが発生することがあります。
  • NULLIF(a, b)は2つの値が等しい場合にNULLを返し、ゼロ除算の防止や空文字列の正規化に適しています。
  • これらを組み合わせることで、安全で表示しやすい式を作成したり、LEFT JOIN後のNULLにデフォルト値を設定したりできます。

最後のレッスンでは、集約関数、JOIN、DISTINCTの内部でNULLがどのように動作するかを扱います。

よくある質問

「COALESCE、NULLIF、ISNULL」レッスンは無料ですか?

はい。「COALESCE、NULLIF、ISNULL」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。

「COALESCE、NULLIF、ISNULL」で何を学びますか?

デフォルト値への置換と、COALESCEとベンダー固有関数の違いを学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「COALESCE、NULLIF、ISNULL」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 三値論理とUNKNOWN
  2. IS NULL、IS NOT NULL、NULLセーフな等価比較
  3. COALESCE、NULLIF、ISNULL
  4. 集計、JOIN、DISTINCTにおけるNULL
← SQL Interview Prepに戻る