Quantcast
Channel: 連想配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 121

SQLで連想配列が使えないかを調査→JSONならできる(PostgreSQL)

$
0
0

概要

ストアドファンクションの中で、テーブルのデータを取得して連想配列のように使いたい場面があったので調査。
データを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)

以上。


Viewing all articles
Browse latest Browse all 121

Trending Articles