PostgresqlでJSONと少し戦う
やりたいこと
"[{"id":"hoge", "content":"hogehoge",...}]"
というtext形式の列(列名sections
(仮))の中のcontent
部分を抽出したい。
あんまり実践的な資料がなかったので書いときます。
抽出方針
- 一旦この文字列をJSONに変換
- その中の
content
要素を抽出する
結論
色々詰まったけども
with cont as ( select sections::json -> 0 ->> 'content' as content from contents_table where created_at between '2018-04-01' and '2018-04-07' ) select * from cont ;
こんな感じでいける。
sections::json
でsections
列をまるっとJSONに変換-> 0
で0番目(最初)の要素を抽出する->> 'content'
でcontent
オブジェクトのフィールドをtextとして抽出
詰まったポイントは
- 最初からJSONで入ってる列じゃなかったから一旦text→JSONの変換が必要
- JSON変換のところで
row_to_json
など他の関数を使ったほうがいいのかと思って色々試す - JSON変換して
content
の中身取得すればいいわけではなく、一旦-> 0
で0番目(最初)の要素を抽出する、という工程が必要だった
でした。