PR

JSONBの機能強化

2016年6月23日(木)
岡野 慎也(おかのしんや)

今回は、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)の機能強化について詳しく解説します。

著者
岡野 慎也(おかのしんや)
株式会社メトロシステムズ

OSSプロダクトを扱う専門チームに所属し、PostgreSQLに関連する業務は10年以上担当。

R&DでPostgreSQLの知識を日々深めつつ、国内有数の大手企業のシステムに対してPostgreSQLを導入する案件に複数参加している。最近はPostgreSQLの書籍の執筆等も手掛けている。

連載バックナンバー

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています