JSONBの機能強化
今回は、PostgreSQL 9.5(以下、9.5)で機能強化されたJSONBについて、実際に動かしながら紹介します。
JSONBの機能強化
JSONBデータ型は、PostgreSQL 9.4(以下、9.4)で導入されたJSONデータ(JavaScript Object Notation:テキストベースのフォーマット)をバイナリ形式で格納するためのデータ型です。9.5では、このJSONBデータ型の機能が強化され、新規に関連する複数の関数や演算子等が実装されました。
以下のように定義されたempテーブルを用いて、これら新規に実装された主な関数や演算子の振る舞いを確認してみましょう。
jsonb_set関数
9.4ではUPDATE文を用いて行全体を更新できましたが、特定のメンバ(キーと値の組み合わせ)のみを更新することはできず、変更不要なメンバも含めすべて書き出してUPDATE文で更新するか、複雑なユーザ定義関数を作成して独自のUPDATE関数を作るといった方法しかありませんでした。しかし、9.5から追加されたjsonb_set()を用いることで、特定のメンバにUPDATEが可能となり、容易に更新処理が行えるようになりました。
以下のデータを持つempテーブルを用いて、9.5以前と9.5の更新方法を説明します。なお、いずれの例もidキーの値が「200」以上でかつdeptキーの値が「sales」である行を「delivery」に更新する処理です。
9.5以前の更新(1)
変更が不要なメンバ(id)も含め、要素全体を書き出して更新する方法です。なお、idキーの値を更新するに伴い、対象行数分のクエリを用意して発行する必要があります。
9.5以前の更新(2)
対象行を削除後に変更されたデータを挿入する方法です。UPDATE文を用いる方法と同様に対象行数分のクエリを用意して発行する必要がありますが、DELETE文を用いた削除処理は1文で完結させることができます。
9.5の更新
以下のように、jsonb_set()を用いることで対象のメンバ(dept)の値のみを変更できます。これにより変更が不要なメンバ(id)の更新処理を行う必要がなくなり、DELETE文と同様にWHERE句に範囲を指定することで更新処理を1文で完結できるようになります。
このように、通常のデータ型の更新と同様の方法が可能になったことで、JSONBデータ型の利便性が飛躍的に向上しました。
jsonb_pretty関数
jsonb_pretty()を用いると自動で出力結果にインデントや改行が付加されるため、目視による確認が容易になります。
通常の出力
以下は、通常のJSONBデータ型の出力形式です。すべてのメンバが1行で表示されます。
jsonb_pretty()を利用した際の出力
jsonb_pretty()を用いると、メンバごとに改行が挿入されたり、ネストごとにインデントが挿入されたりするため、JSONBデータ型の内容が読みやすくなります。
-演算子
-演算子を用いると、元のJSONデータから任意のメンバ、または任意の配列要素を削除できます。
任意のメンバの削除
以下の例では、JSONBデータからdeptキーを指定してdeptメンバを削除しています。
元の配列を持つJSONデータ
以下は配列要素を持つJSONBデータです。これらの要素を削除するクエリを記載します。
0番目の配列要素の削除
0番目の配列要素(id)をJSONデータから削除しています。
1番目の配列要素の削除
1番目の配列要素(dept)をJSONデータから削除しています。
2番目の配列要素の削除
2番目の配列要素(memo)をJSONデータから削除しています。
#-演算子
#-演算子を用いると、元のJSONデータからネストされた要素を削除できるようになります。以下の例では、deptメンバの中のd_nameメンバを削除しています。
今回のサンプルSQLはこちらからダウンロードできます。ぜひ、皆さんもお手元の環境で動作確認を実行してみてください。
今回は、PostgreSQLの特徴的な機能であるJSONBについて紹介しました。次回は、Foreign Data Wrapper(FDW)の機能強化について詳しく解説します。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 「PostgreSQL 9.5」の新機能
- UPSERT(ON CONFLICT句)とGROUPING SETS句/CUBE句/ROLLUP句の実装
- 神出鬼没!サブクエリについて(Part.2)
- 神出鬼没! サブクエリについて(Part.1)
- MySQL Database Service(MDS)の分析クエリを高速化する「HeatWave」の使いどころ
- row-level security controlとpg_rewindの実装
- Railsでデータベースを扱うためのライブラリActive Recordについて学んでみた
- テーブル結合について(Part.1) ー「内部結合」と「外部結合」
- 非同期レプリケーション!
- [DBA] データベース記憶域構造の管理