概要
ストアドファンクションの中で、テーブルのデータを取得して連想配列のように使いたい場面があったので調査。
データを1つのJSONにすれば、key指定でvalueが取れるようなので、JSON型を利用することにした。
※何となくもっと良い方法がありそうな気もするけど
前提条件
- postgres9.5.x
お試し用テーブルを準備
以下のようにwith句で一時テーブルをつくって試すことにする。
withtmpas(select*from(values('a',1),('b',2),('c',3),('d',4),('e',5))asa(item1,item2))select*fromtmporderbyitem1;-- 結果item1|item2-------+-------a|1b|2c|3d|4e|5(5行)
データをまるごとJSON形式にする
jsonb_object_aggで集約すると1つのJSONにできることがわかった。
JSONBの方が便利なのでJSONB型を使っている。
※集約については↓参照
https://www.postgresql.jp/document/9.5/html/functions-aggregate.html
-- with句は省略(上をみてください)selectjsonb_object_agg(item1,item2)fromtmp;-- 結果jsonb_object_agg------------------------------------------{"a":1,"b":2,"c":3,"d":4,"e":5}(1行)
JSONのデータにkeyを指定してvalueを取得する
JSONB型に専用の機能があることがわかった。
「->」は、値をそのまま取得で、「->>」は、値をtextで取得。
psqlで実行した結果では同じ表示になる模様。
※JSON関数については↓参照
https://www.postgresql.jp/document/9.5/html/functions-json.html
-- with句は省略(上をみてください)selectjsonb_object_agg(item1,item2)->'c',jsonb_object_agg(item1,item2)->>'c'fromtmp;-- 結果?column?|?column?----------+----------3|3(1行)
JSONのデータを更新する
「||」を使うとデータを更新できる。
既にあるkeyだと更新になるし、ない場合は追加される。
なお、jsonb_build_objectはJSONBを作る関数。
-- with句は省略(上をみてください)selectjsonb_object_agg(item1,item2)||jsonb_build_object('d',40),jsonb_object_agg(item1,item2)||jsonb_build_object('f',6)fromtmp;-- 結果?column?|?column?-------------------------------------------+--------------------------------------------------{"a":1,"b":2,"c":3,"d":40,"e":5}|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6}(1行)
JSONをフォーマットする
jsonb_prettyというフォーマットする関数もある。
-- with句は省略(上をみてください)selectjsonb_pretty(jsonb_object_agg(item1,item2))fromtmp;-- 結果jsonb_pretty--------------{+"a":1,+"b":2,+"c":3,+"d":4,+"e":5+}(1行)
以上。