JSONパッチデータからSQL UPDATE文を生成する

JSONオブジェクトをSQL UPDATE文に変換する方法を学びます。部分更新、WHERE句の生成、条件付きSET式、ネストされた更新ペイロードの処理を解説します。

Advanced Patterns

詳細な説明

JSONからSQL UPDATEへ

すべてのJSON-to-SQL変換がINSERT操作とは限りません。既存レコードへの変更を表す部分的なJSONオブジェクトを受信した場合、代わりにUPDATE文が必要です。

JSONの例(部分更新)

{
  "id": 42,
  "name": "Alice Johnson",
  "email": "alice.johnson@newdomain.com",
  "score": 99
}

生成されるSQL

UPDATE users SET
  name = 'Alice Johnson',
  email = 'alice.johnson@newdomain.com',
  score = 99
WHERE id = 42;

WHERE句の識別

コンバーターはどのフィールドが行を識別するかを知る必要があります。一般的な戦略:

  1. 主キーフィールド -- デフォルトでidを使用
  2. ユーザー指定キー -- WHEREカラムをユーザーに選択させる
  3. 複合キー -- 複数フィールドを使用(WHERE user_id = 1 AND date = '2024-06-15'

SETからキーを除外

WHEREカラムはSET句に表示されるべきではありません:

-- 間違い:idがSETとWHEREの両方にある
UPDATE users SET id = 42, name = 'Alice' WHERE id = 42;

-- 正しい:idはWHEREのみ
UPDATE users SET name = 'Alice' WHERE id = 42;

更新でのNull処理

{ "id": 42, "bio": null, "phone": null }
UPDATE users SET bio = NULL, phone = NULL WHERE id = 42;

カラムをNULLに設定することは、オプションフィールドをクリアするための有効で一般的な操作です。

JSON配列からのバッチ更新

[
  { "id": 1, "score": 95 },
  { "id": 2, "score": 87 },
  { "id": 3, "score": 92 }
]
UPDATE users SET score = 95 WHERE id = 1;
UPDATE users SET score = 87 WHERE id = 2;
UPDATE users SET score = 92 WHERE id = 3;

UPDATE vs UPSERT

シナリオ
行が確実に存在する UPDATE
行が存在するかもしれない INSERT ... ON CONFLICT ... DO UPDATE
行が存在してはならない INSERT(ユニーク制約付き)

条件付き更新

より複雑なロジックの場合、コンバーターはCASE式を生成できます:

UPDATE users SET
  score = CASE
    WHEN id = 1 THEN 95
    WHEN id = 2 THEN 87
    WHEN id = 3 THEN 92
  END
WHERE id IN (1, 2, 3);

これはすべての更新を単一の文で実行するため、個別のUPDATE文よりも効率的です。

ユースケース

フロントエンドアプリケーションがユーザープロファイルを更新するためにJSON PATCHペイロードを送信する際、バックエンドは変更されたフィールドのみを修正するUPDATE文を生成する必要があります。自動化されたJSON-to-UPDATE変換により、正しいSET句の生成が保証され、偶発的なデータ上書きが防止されます。

試してみる — JSON to SQL

フルツールを開く