🧚 お知らせ!Beekeeper Studioは高速でモダンなオープンソースのデータベースGUIです ダウンロード
2025年8月24日 著者:Matthew Rathbone

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のLinux版は100%フル機能。手抜きも機能の妥協も一切ありません。

Beekeeper Studio 利用者の声

★★★★★
「Beekeeper Studioで以前のSQLワークフローを完全に置き換えました。高速で直感的、データベース作業がまた楽しくなりました。」
— Alex K.、データベース開発者
★★★★★
「多くのデータベースGUIを試してきましたが、Beekeeperは機能とシンプルさのバランスが完璧です。とにかくちゃんと動きます。」
— Sarah M.、フルスタックエンジニア