PostgreSQLのJSONBデータ型を使うと、データベース内でJSONデータを簡単に扱えます。単なる保存にとどまらず、JSONデータを細かく操作・クエリできる高度な関数が用意されています。このガイドでは、実践的な例を交えながらJSONB関数を紹介し、PostgreSQLの力をJSONデータ管理に活かす方法を解説します。
json型とjsonb型の両方を含む、PostgreSQLでのJSONの扱い方の全体像については、PostgreSQL JSON関数の総合ガイドをご覧ください。
JSONBの概要
PostgreSQLのjsonbデータ型は、JSONデータをバイナリ形式で保存します。非常に効率的で、jsonにはないインデックス機能を備えています。柔軟性とパフォーマンスの面から、一般的にはJSONBの方が適しています。
JSONBを使ったテーブルの作成
まずはjsonbデータ型を使うテーブルを作成しましょう:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
data JSONB
);
JSONBデータの挿入
JSONBデータは標準的なJSON構文で挿入します。PostgreSQLが自動的にJSONを検証し、バイナリ形式に変換します:
INSERT INTO users (data) VALUES
('{"name": "John Doe", "email": "john@example.com", "age": 30}'),
('{"name": "Jane Doe", "email": "jane@example.com", "age": 25}'),
('{"name": "Alice Smith", "email": "alice@example.com", "age": 28, "address": {"city": "New York", "state": "NY"}}');
JSONBの値へのアクセス
PostgreSQLには、JSONBの値を取り出すためのさまざまな演算子が用意されています。
JSONBオブジェクトの抽出
ネストされたJSONBの値にアクセスするには、->演算子と->>演算子を使います。->演算子はJSON形式でデータを返し、->>はテキストを返します。
SELECT data->'name' AS name, data->>'email' AS email FROM users;
出力例:
name | email
---------+--------------------
"John Doe" | john@example.com
"Jane Doe" | jane@example.com
ネストされたJSONBの値の抽出
より深いJSON構造では、演算子をつなげて使います。?演算子で先にキーの存在を確認します:
SELECT
data->>'name' AS name,
data->'address'->>'city' AS city
FROM users
WHERE data ? 'address';
出力例:
name | city
-------------|----------
Alice Smith | New York
JSONB関数
PostgreSQLには、単純な値の抽出以外にも多くのJSONB関数があります。
キーの存在確認
?演算子はキーが存在するかを確認します:
SELECT data ? 'age' AS has_age FROM users;
出力例:
has_age
---------
t
t
t
包含の確認
@>演算子を使うと、あるJSONオブジェクトが別のオブジェクトを含んでいるかを確認できます:
SELECT * FROM users WHERE data @> '{"age": 30}';
出力例:
id | data
----+---------------------------------------------
1 | {"name": "John Doe", "email": "john@example.com", "age": 30}
JSONBの連結
||演算子でJSONBの列や値を結合します:
SELECT data || '{"verified": false}' AS updated_data FROM users;
出力例:
updated_data
-------------------------------------------------------------------
{"age": 30, "name": "John Doe", "email": "john@example.com", "verified": false}
{"age": 25, "name": "Jane Doe", "email": "jane@example.com", "verified": false}
{"age": 28, "name": "Alice Smith", "email": "alice@example.com", "address": {"city": "New York", "state": "NY"}, "verified": false}
JSONBからキーを削除する
-演算子でキーを削除します:
SELECT data - 'age' AS partial_data FROM users;
出力例:
partial_data
--------------------------------------------------------------------
{"name": "John Doe", "email": "john@example.com"}
{"name": "Jane Doe", "email": "jane@example.com"}
{"name": "Alice Smith", "email": "alice@example.com", "address": {"city": "New York", "state": "NY"}}
JSONBのインデックス
JSONBデータに対するクエリのパフォーマンスを高めるには、インデックスを使います。
JSONBインデックスの作成
JSONB型にはGINインデックスが最適です:
CREATE INDEX idx_users_data ON users USING GIN (data);
このインデックスにより、JSONのキーやキーと値のペアの存在検索などの処理が高速になります。
高度なJSONB関数
PostgreSQLには、より複雑な処理のための関数も用意されています:
-- Convert JSONB to key-value pairs
SELECT jsonb_each_text(data) FROM users LIMIT 1;
-- Get all keys from a JSONB object
SELECT jsonb_object_keys(data) FROM users LIMIT 1;
-- Update a nested value using jsonb_set
UPDATE users
SET data = jsonb_set(data, '{address,zip}', '"10001"')
WHERE data ? 'address';
まとめ
PostgreSQLのJSONB関数は、データベース内でJSONデータを扱うための強力で柔軟な手段を提供します。主な利点は次のとおりです:
- パフォーマンス:効率的なインデックスに対応したバイナリ保存形式
-
豊富な演算子:
->、->>、@>、?で簡単に抽出・操作 -
高度な関数:
jsonb_set、jsonb_each_text、jsonb_array_elementsなどによる複雑な処理 - インデックス対応:GINインデックスで高速なクエリ
これらの機能により、PostgreSQLは従来のリレーショナルデータとあわせて半構造化JSONデータを保存・クエリする必要があるアプリケーションに最適な選択肢となります。JSONB関数をマスターすれば、より柔軟で効率的なデータベースアプリケーションを構築できます。
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio 利用者の声
「Beekeeper Studioで以前のSQLワークフローを完全に置き換えました。高速で直感的、データベース作業がまた楽しくなりました。」
「多くのデータベースGUIを試してきましたが、Beekeeperは機能とシンプルさのバランスが完璧です。とにかくちゃんと動きます。」