クイックリファレンス

PostgreSQL JSON・JSONB チートシート

PostgreSQL の JSON と JSONB のクイックリファレンス:抽出演算子、包含・存在判定、パス指定による更新、集計・構築関数を整理。

· 公開日

PostgreSQL は json(テキストをそのまま保存)と jsonb(GIN インデックスと高速検索に対応した分解バイナリ形式)によって JSON データをネイティブにサポートしています。

抽出演算子

一重矢印(->、#>)は json/jsonb を返します。二重矢印(->>、#>>)は text を返します。

SELECT * FROM users WHERE data->>'name' = 'John';
SELECT data->>'name' AS name FROM users;
演算子 左辺の型 右辺の型 説明 戻り値の型
-> jsonb int 0始まりのインデックスで配列要素を取得 jsonb
-> jsonb text キーでオブジェクトのフィールドを取得 jsonb
#> jsonb text[] 指定したパスにある値を取得 jsonb
->> jsonb int 配列要素をテキストとして取得 text
->> jsonb text オブジェクトのフィールドをテキストとして取得 text
#>> jsonb text[] 指定したパスの値をテキストとして取得 text

パスクエリの例

-- Extract nested data.address.city as text
SELECT data#>>'{address,city}' FROM customers;

-- Extract second element in items array
SELECT order_info->'items'->>1 FROM orders;

論理・包含演算子(jsonb 専用)

-- Check if JSON object contains a specific top-level key
SELECT * FROM users WHERE data ? 'email';

-- Check if JSON contains all keys in array
SELECT * FROM users WHERE data ?& array['name', 'email'];

-- Check if JSON contains any key in array
SELECT * FROM users WHERE data ?| array['mobile', 'email'];

-- Containment: Left contains Right
SELECT * FROM users WHERE data @> '{"role": "admin"}'::jsonb;

-- Contained by: Left is contained within Right
SELECT * FROM users WHERE data <@ '{"role": "admin", "active": true}'::jsonb;

JSONB データの変更と更新

連結とキーの削除

-- Append or update key in jsonb object
UPDATE users SET data = data || '{"active": true}'::jsonb WHERE id = 1;

-- Delete key from object
UPDATE users SET data = data - 'temporary_token' WHERE id = 1;

-- Delete element from array by index
UPDATE users SET tags = tags - 1 WHERE id = 1;

-- Delete nested path
UPDATE users SET data = data #- '{profile,avatar}' WHERE id = 1;

jsonb_set 関数

-- Syntax: jsonb_set(target, path, new_value, create_missing)
UPDATE users
SET data = jsonb_set(data, '{contact,phone}', '"555-0199"', true)
WHERE id = 1;

集計・構築関数

-- Convert rows to JSON array
SELECT json_agg(u) FROM (SELECT id, name FROM users) u;

-- Build JSON object from key-value pairs
SELECT json_build_object('id', id, 'username', name) FROM users;

-- Expand JSON object to table rows
SELECT * FROM json_each('{"a": 1, "b": 2}');
-- Returns columns: key (text), value (json)

リファレンス

関連テーマ