0Pricing
SQL Academy · レッスン

IS NULL、IS NOT NULLとCOALESCE

IS NULLでNULLを検出し、COALESCE / NULLIFで置き換え、欠損データがあっても適切に動くクエリを設計します。

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

NULLの検査

IS NULLとIS NOT NULLを使用し、決して= NULLとは書かないでください。

SELECT * FROM users WHERE deleted_at IS NULL;
SELECT * FROM users WHERE deleted_at IS NOT NULL;

= NULLがひそかに失敗する理由

NULLと何かを比較するとNULL(不明)になります。その行は除外されますが、エラーは発生しないため、バグがそのままリリースされてしまいます。

SELECT * FROM users WHERE deleted_at = NULL;
-- → returns 0 rows, always

COALESCE:最初の非NULL値

COALESCEは任意の数の引数を受け取り、NULLではない最初の引数を返します。

SELECT id,
       COALESCE(nickname, full_name, email, 'Anonymous') AS display_name
FROM users;

WHEREでのCOALESCE

COALESCEを使ってNULLを、ソートや比較に使用できるデフォルト値に変換します。

-- Treat NULL last_login_at as the epoch:
SELECT * FROM users
ORDER BY COALESCE(last_login_at, '1970-01-01') DESC;

NULLIF:逆の処理

NULLIF(a, b)はa = bの場合にNULLを返し、それ以外の場合はaを返します。

-- Treat 0 as missing so AVG ignores it:
SELECT AVG(NULLIF(price, 0)) FROM products;

-- Convert empty string to NULL on insert:
INSERT INTO contacts (phone) VALUES (NULLIF(:phone, ''));

条件付きデフォルト値にCASEを使う

COALESCEでは柔軟性が足りない場合は、汎用的な代替手段としてCASEを使用します。

SELECT id,
  CASE
    WHEN status IS NULL OR status = '' THEN 'unknown'
    WHEN status = 'A' THEN 'active'
    ELSE status
  END AS status_label
FROM users;

CHECKと制約におけるNULL

CHECK制約は、条件がNULLの場合に通過します。NULLを禁止する必要がある場合は、明示的に指定してください。

CREATE TABLE prices (
  amount NUMERIC(10,2),
  CHECK (amount > 0)        -- amount = NULL passes!
);

-- Better:
CREATE TABLE prices2 (
  amount NUMERIC(10,2) NOT NULL CHECK (amount > 0)
);

JOIN ONにおけるNULL

結合キーがNULLの行の組み合わせは決してマッチしません。NULL = NULLの結果もNULLだからです。NULL同士を等しいものとして扱う場合は、IS NOT DISTINCT FROMを使用してください。

SELECT * FROM a JOIN b ON a.key IS NOT DISTINCT FROM b.key;

NULLとUNIQUE

標準SQLでは、UNIQUE制約においてNULL同士は異なる値として扱われます。そのため、NULLを含む行を複数持つことができます。

CREATE TABLE invites (
  id BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) UNIQUE
);
INSERT INTO invites (email) VALUES (NULL), (NULL); -- both succeed!

NULLと集約のまとめ

COUNT(*)を除く集約関数は、NULLを無視します。

SELECT COUNT(*)            FROM users;  -- all rows
SELECT COUNT(email)        FROM users;  -- rows where email IS NOT NULL
SELECT COUNT(DISTINCT id)  FROM users;

可能な限りNOT NULLを必ず宣言する

NOT NULLは、最も簡単で強力な正確性の保証です。決して空にしてはならないすべての列に追加してください。

まとめ

NULLの扱いは、SQLにおける微妙なバグの最大の原因です。

  • IS NULLで検査する
  • COALESCEで置き換える
  • NULLIFで特別な値をNULLに変換する
  • デフォルトでNOT NULLにする

クイックチェック

NULLでなければemailを、NULLならリテラル'no-email'を返す式はどれですか。

よくある質問

「IS NULL、IS NOT NULLとCOALESCE」レッスンは無料ですか?

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

「IS NULL、IS NOT NULLとCOALESCE」で何を学びますか?

IS NULLでNULLを検出し、COALESCE / NULLIFで置き換え、欠損データがあっても適切に動くクエリを設計します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「IS NULL、IS NOT NULLとCOALESCE」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. LIKEパターンとワイルドカード
  2. 集合に対するINとNOT IN
  3. 範囲に対するBETWEEN
  4. IS NULL、IS NOT NULLとCOALESCE
← SQL Academyに戻る