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, alwaysCOALESCE:最初の非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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- LIKEパターンとワイルドカード
- 集合に対するINとNOT IN
- 範囲に対するBETWEEN
- IS NULL、IS NOT NULLとCOALESCE