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データに対する部分指定での抽出が可能になりました。
以上です。
コメント