CodeGym /コース /SQL SELF /jsonb_set() と jsonb_insert() を使ったJSONオブジェクト...

jsonb_set() と jsonb_insert() を使ったJSONオブジェクトのデータ更新

SQL SELF
レベル 33 , レッスン 4
使用可能

さて、PostgreSQLのJSONBって、複雑な階層データを保存するのにめっちゃ便利なツールだよね。でも、もしJSONBカラムの中身を更新したいときはどうする?たとえば、ユーザーの電話番号を変えたり、配列に新しいカテゴリを追加したり。簡単そうだけど、JSONBはテーブルみたいにセルを直接書き換えるわけじゃない。データを更新するには専用の関数を使う必要があるんだ。今日は主役として:

  • jsonb_set(): 指定した「パス」に値を変更・追加するための関数。
  • jsonb_insert(): JSON配列に新しい要素を挿入するための関数。

jsonb_set() でデータを更新する

jsonb_set() 関数は、JSONBオブジェクトの一部を変更したり、新しいキーや値を追加したりできるよ。

基本の構文

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — 更新したいJSONBオブジェクト。
  • path — 変更したいキーへのパスを表す文字列配列。
  • new_value — 追加または置き換えたい値。
  • create_missing — 足りないキーを作るかどうかのブール値(TRUEかFALSE)。

じゃあ、めっちゃシンプルな例を見てみよう。たとえば、users というテーブルがあって、profile というJSONBカラムにユーザープロフィールが入ってるとする。あるユーザーが電話番号を更新したいとき、どうやる?

-- テーブル作成とデータ追加
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

INSERT INTO users (profile)
VALUES ('{"name": "オットー", "contact": {"phone": "+1-495-123-45-67"}}');

-- 電話番号を更新
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- 結果を確認
SELECT profile FROM users WHERE id = 1;

結果:

{
  "name": "オットー",
  "contact": {
    "phone": "8-800-555-35-35"
  }
}

やった!電話番号が変わったね!パスは '{contact,phone}' みたいに文字列配列で指定するのがポイント。

新しいキーを追加する

もし更新したいキーが存在しない場合は、create_missing = TRUE を使えば新しく作れるよ:

UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"ベルリン"', TRUE)
WHERE id = 1;

-- 結果を確認
SELECT profile FROM users WHERE id = 1;

結果:

{
  "name": "オットー",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "ベルリン"
  }
}

これで新しい住所セクションができた!便利だよね?

jsonb_insert() でデータを挿入する

jsonb_insert() 関数は、JSONBオブジェクト内の配列に要素を追加するために使うよ。

基本の構文

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — 対象のJSONBオブジェクト。
  • path — 要素を挿入したい配列へのパス。
  • new_value — 追加したい値。
  • insert_after — FALSEなら指定インデックスの前、TRUEなら後ろに挿入。

例を見てみよう。たとえば、profile カラムにユーザーの興味リストが入ってるとする。新しい興味を配列に追加したい場合:

-- サンプルデータを追加
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["スポーツ", "音楽"]', TRUE)
WHERE id = 1;

-- 新しい興味「プログラミング」をリストの先頭に挿入
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"プログラミング"', FALSE)
WHERE id = 1;

-- 結果を確認
SELECT profile FROM users WHERE id = 1;

結果:

{
  "name": "オットー",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "ベルリン"
  },
  "interests": [
    "プログラミング",
    "スポーツ",
    "音楽"
  ]
}

よくあるトラブルとその回避法

jsonb_set()jsonb_insert() を使うとき、以下のポイントに注意しないとちょっとハマることがあるよ:

  1. パスの指定ミス。 間違ったパスを指定したり、create_missing=TRUE なしで存在しない要素を更新しようとすると、エラーになったり何も変わらなかったりする。JSONの構造はちゃんと確認しよう。
  2. データ型の不一致。 new_value は必ずJSONB型じゃないとダメ。文字列を入れたいときは必ずダブルクォートで囲む('"値"' みたいに)。
  3. データの上書き。 配列をうっかり普通に更新しようとすると、前のデータが消えちゃうことも。新しい要素を安全に追加したいなら jsonb_insert() を使おう。

エラー例:

-- エラー:パスが間違ってる
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"新しいコンタクト"', FALSE)
WHERE id = 1;

これは profile オブジェクトに contacts キーがなくて、create_missing がFALSEだからエラーになるよ。

回避方法:

-- create_missing = TRUE を指定
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"新しいコンタクト"', TRUE)
WHERE id = 1;

実際どんな場面で使うの?

JSONBを使いこなすのは、ただの遊びじゃなくて、今どきのアプリ開発では超重要なスキル!例えば:

  • ユーザー設定の保存。 JSONBは、ユーザーごとに違うアプリ設定みたいな動的データ構造にピッタリ。
  • 外部APIとの連携。 REST APIから返ってくる生のJSONデータを保存するのにも便利。
  • ビッグデータ分析。 IoTデータやログ、アナリティクスみたいなネスト構造のデータも扱いやすい。

これでJSONオブジェクトの更新入門はおしまい!これからはJSONBにデータを挿入・更新・追加する方法や、よくあるミスの回避法もバッチリだね。次の講義では、JSONBオブジェクトの結合や、もっと効率的な使い方を紹介するよ!

1
アンケート/クイズ
JSONデータの処理、レベル 33、レッスン 4
使用不可
JSONデータの処理
JSONデータの処理
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION