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でフィルタリングする分析クエリに不可欠です。

試してみる — JSON to SQL

フルツールを開く