Tech`s Report

MENU

【最新版】PostgreSQLのJSONの仕様 - 各バージョンのリリース内容

PostgreSQLでJSONの取り扱いについて各バージョンでどうバージョンアップされてきたのかまとめました。  

PostgreSQL 9.2 のサポート内容

初めてPostgreSQLにJSONという概念が生まれました。 (できることは非常に少ないです。)  

JSON 型の導入

JSON型のカラムを作成できるようになりました。JSON文字列をデータとして登録できます。
但し、JSON内のキーや値を検索条件にしたりは残念ながらできませんでした。  

JSON 作成関数のサポート

JSON文字列を生成する関数が2つだけサポートされました。

関数 説明
array_to_json 配列→JSON文字列変換の関数
row_to_json 行型→JSON文字列変換の関数

 

PostgreSQL 9.3 のサポート内容

トピックとしては演算子の登場により「パスによるアクセス」や「JSON内の値を検索条件にする」といったことが可能になった点です。  

JSON 作成関数のサポート強化・演算子の登場

こちらに使用できる関数と演算子が一覧化されますのでご参照ください。
https://www.postgresql.jp/document/9.3/html/functions-json.html

9.3からはできることがかなり増えていますね。
 

JSON データ型へのパスによるアクセス

演算子の登場により、パスを指定することで特定のキーの値のみを取得といったことが可能になりました。

 

JSON 内の値を使った条件検索

演算子の登場により、特定のキーの値を検索条件にすることが可能になりました。  

 
 

PostgreSQL 9.4 のサポート内容

トピックとしてはJSONB型の登場により検索性能の大幅に向上した点です。

JSONB 型の導入

JSONB型はデータをバイナリ形式で保管します。これにより検索の高速化ないしは「専用演算子」や「GINインデックス」が使用可能になります。

JSONB型専用演算子の登場

演算子 説明
@> 左のJSON値はその中に右の値を包含するか
<@ 左のJSON値は右の値の中に包含されるか
? キー/要素文字列はJSON値の中に存在するか
?| キー/要素文字列のいずれかが存在するか
?& キー/要素文字列のすべてが存在するか

 

GIN インデックス対応

JSONB型にインデックスが作成可能になりました。これにより検索性能が大幅に向上しました。
 

JSON処理関数の登場

JSONを処理する際の専用の関数が追加されました。 詳細は以下をご確認ください。
https://www.postgresql.jp/document/9.4/html/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE

 
 

PostgreSQL 9.5 のサポート内容

JSONB型の機能が追加されてます。  

JSONB型専用演算子の追加

演算子 説明
|| 2つのjsonb値を結合して、新しいjsonb値を作る
- 指定した要素の削除
#- 指定したパスのフィールドまたは要素を削除する

 

JSONB型の処理関数の追加

関数 説明
jsonb_set 行全体ではなく特定の値のみ更新可能
jsonb_pretty インデントや改行を自動で行う

 
 

PostgreSQL 9.6 のサポート内容

JSONB型の機能が追加されてます。  

JSONB型の処理関数の追加(jsonb_insert)

関数 説明
jsonb_insert jsonbデータ構造の内部に要素を挿入できる

 

JSONB型のhstoreの変換内容の修正

hstore_to_jsonb_loose()の変換内容がhstore_to_json_loose()と一致するように修正されました。

 

PostgreSQL 10 のサポート内容

JSON型とJSONB型の全文検索対応

全文検索が可能になりました。JSONの値に文章などが格納されている場合は非常にありがたい機能ですね。
 

PostgreSQL 11 のサポート内容

json(b)_to_tsvector() の追加

JSON型とJSONB値に対してテキスト検索問い合わせ用の tsvectorデータを生成可能な json_to_tsvector() と jsonb_to_tsvector() が追加されました。  
 

PostgreSQL 12 のサポート内容

JSONB型で JSON Path の登場

JSONB型のデータに対してSQLでの問い合わせにJSONパスが利用可能になりました。 これによりJSONデータに対する部分指定での抽出が可能になりました。  

 
以上です。