Copy & Paste Engineer

【PostgreSQL】JSONフィールドを使用する

【PostgreSQL】JSONフィールドを使用する

PostgreSQLはJSONデータをそのまま保存でき、柔軟な検索機能を利用することで、複雑なデータ構造を効率的に扱うことができます。PostgreSQLでのJSONフィールドの検索方法について解説します。

JSONフィールドの基本操作

JSONとJSONBの違い

PostgreSQLでは、JSONデータ型とJSONBデータ型の2種類がサポートされています。それぞれの違いを以下の表にまとめました。

特性 JSON JSONB
保存形式 テキスト形式 バイナリ形式
保存速度 高速(そのまま保存するため) 低速(バイナリに変換するため)
検索速度 低速(解析が必要) 高速(直接検索可能)
ストレージ効率 非効率(そのままのサイズ) 効率的(バイナリ圧縮)
重複キーの扱い 許可(後からのキーが優先) 不許可(エラーが発生)
インデックス サポートされていない GINやBTREEインデックスをサポート

JSONデータの挿入方法

まずは、JSONデータを含むテーブルを作成し、データを挿入する方法を見てみましょう。

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    data JSONB
);

INSERT INTO users (data) VALUES
('{"name": "Alice", "age": 30, "address": {"city": "Tokyo", "zipcode": "100-0001"}}'),
('{"name": "Bob", "age": 25, "address": {"city": "Osaka", "zipcode": "530-0001"}}');

JSONフィールドの基本検索

単一キーの検索

JSONフィールド内の特定のキーを検索するには、->>演算子を使用します。たとえば、すべてのユーザーの名前を取得するには次のようにします。

SELECT data->>'name' AS name FROM users;

ネストされたキーの検索

ネストされたJSONオブジェクト内のキーを検索するには、->演算子を使用します。たとえば、すべてのユーザーの都市名を取得するには次のようにします。

SELECT data->'address'->>'city' AS city FROM users;

複雑な検索クエリ

複数条件の検索

複数の条件で検索する場合、WHERE句を組み合わせて使用します。たとえば、年齢が30以上のユーザーを検索するには次のようにします。

SELECT * FROM users WHERE (data->>'age')::int >= 30;

配列内のオブジェクト検索

JSONフィールドが配列を含む場合、その中のオブジェクトを検索することもできます。たとえば、特定の条件に一致する配列内のオブジェクトを検索するには次のようにします。

SELECT * FROM users WHERE data @> '{"address": {"city": "Tokyo"}}';

他のデータ型への変換

JSONフィールド内の値を他のデータ型に変換することも可能です。以下にいくつかの例を示します。

キーの存在確認

JSONフィールド内で特定のキーが存在するかどうかを確認する方法を、WHERE句に組み込んで使用することもできます。以下にいくつかの例を示します。

インデックスの活用

GINインデックス

JSONBデータ型の検索を高速化するためには、GINインデックスを使用することが推奨されます。次のようにインデックスを作成します。

CREATE INDEX idx_gin_users_data ON users USING GIN (data);

JSONBとパフォーマンス

JSONBは、検索や操作の速度が速いだけでなく、効率的なストレージも提供します。とくに、大量のデータを扱う場合や複雑なクエリを実行する場合に、そのパフォーマンスの利点を最大限に活用できます。

まとめ

PostgreSQLでJSONフィールドを検索する方法について解説しました。基本的なクエリの書き方から、複雑な検索条件の設定、インデックスの活用までをカバーしました。JSONデータを効率的に扱うことで、アプリケーションのデータ管理がより柔軟かつ強力になります。ぜひ、実際のプロジェクトでこれらのテクニックを活用してみてください。

参考