SQL INSERT文でのJSON Null値の処理
JSON null値をSQL NULLに正しく変換する方法を学びます。キーの欠落と明示的なnullの違い、nullableカラム、NOT NULL制約の処理を解説します。
Basic INSERT
詳細な説明
JSON NullからSQL NULLへ
JSONにはファーストクラスのnull型があり、SQLにはNULLキーワードがあります。概念は共通していますが、制約違反やデータ整合性の問題を避けるために慎重な処理が必要です。
JSONの例
{
"id": 1,
"name": "Alice",
"middle_name": null,
"email": "alice@example.com",
"phone": null
}
生成されるSQL
INSERT INTO users (id, name, middle_name, email, phone)
VALUES (1, 'Alice', NULL, 'alice@example.com', NULL);
Null vs キーの欠落
明示的なnull値とキーの欠落には重要な違いがあります:
| JSON状態 | SQL動作 |
|---|---|
キーが存在し、値がnull |
カラムにNULLを設定 |
| キーが完全に欠落 | カラムを省略(DEFAULTまたはNULLを使用) |
NOT NULL制約
ターゲットカラムにNOT NULL制約がある場合、NULLの挿入はエラーになります:
ERROR: null value in column "name" violates not-null constraint
コンバーターは、非nullableと分かっているカラムにnull値がある場合に警告を出すべきです。
デフォルトフォールバックのCOALESCE
クエリ時にNULLをデフォルト値で置換したい場合:
INSERT INTO users (id, name, middle_name)
VALUES (1, 'Alice', COALESCE(NULL, 'N/A'));
-- middle_nameは'N/A'になります
比較でのNULL
SQL NULLは自身を含む何とも等しくないことを覚えておいてください:
SELECT * FROM users WHERE middle_name = NULL; -- 間違い!何も返さない
SELECT * FROM users WHERE middle_name IS NULL; -- 正しい
バッチ処理
マルチロウ挿入では、null値が異なる行の異なるカラムに現れることがあります。コンバーターは一貫したカラム順序を保証し、欠落値をNULLで埋めて、すべての行が同じ数の値を持つようにします。
ユースケース
オプションフィールド(電話番号やバイオなど)を含むAPIレスポンスを読み込む際、JSON nullをSQL NULLに正しくマッピングすることで、データベーススキーマのnullableカラムが正確に設定されます。IS NULL / IS NOT NULLでフィルタリングする分析クエリに不可欠です。