JavaScriptを有効にしてください

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

 ·  ☕ 3 分で読めます

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

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

JSONフィールドの基本操作

JSONとJSONBの違い

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

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

JSONデータの挿入方法

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

1
2
3
4
5
6
7
8
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フィールド内の特定のキーを検索するには、->>演算子を使用します。たとえば、すべてのユーザーの名前を取得するには次のようにします。

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

ネストされたキーの検索

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

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

複雑な検索クエリ

複数条件の検索

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

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

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

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

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

他のデータ型への変換

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

  • 数値に変換する場合:

    1
    
    SELECT (data->>'age')::int AS age FROM users;
    
  • ブール値に変換する場合:

    1
    
    SELECT (data->>'active')::boolean AS active FROM users;
    
  • 日付に変換する場合:

    1
    
    SELECT (data->>'created_at')::timestamp AS created_at FROM users;
    
  • 文字列に変換する場合:

    1
    
    SELECT (data->>'zipcode')::text AS zipcode FROM users;
    

キーの存在確認

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

  • キーが存在するか確認する場合:

    1
    
    SELECT * FROM users WHERE data ? 'name';
    
  • キーが存在しない場合の確認:

    1
    
    SELECT * FROM users WHERE NOT (data ? 'name');
    
  • ネストされたキーが存在するか確認する場合:

    1
    
    SELECT * FROM users WHERE data->'address' ? 'city';
    

インデックスの活用

GINインデックス

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

1
CREATE INDEX idx_gin_users_data ON users USING GIN (data);

JSONBとパフォーマンス

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

まとめ

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

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer