前提
[ { "foo": "foo内容1", "bar": "bar内容1", "kore": "kore1" }, { "foo": "foo内容2", "bar": "bar内容2" }, { "foo": "foo内容3", "bar": "bar内容3" } ]
上記のように、配列の中にさらにjsonが入っているタイプのデータがjsonbカラムに入っていた場合。
したいこと
"kore":"kore1"というデータが存在する行だけ取得したい("kore":"kore1"を含まないデータは除外したい)
SELECT * FROM target_table t WHERE t.target_column @> '[{"kore":"kore1"}]'
でOKのようです。ポイントは[]
配列の中に、存在を確認したいキーと値の組み合わせを入れるという…。これでいちおう配列jsonの格納されたjsonbタイプのデータで、含まれているものだけが抽出されました。
(直観的ではないですが…)
以下のようなカラムを持つ行は取得されません。 - "kore"キーを持つjsonデータがない
[ { "foo": "foo内容1", "bar": "bar内容1", }, { "foo": "foo内容2", "bar": "bar内容2" }, { "foo": "foo内容3", "bar": "bar内容3" } ]
- "kore"キーの値が"kore1"ではない
[ { "foo": "foo内容1", "bar": "bar内容1", }, { "foo": "foo内容2", "bar": "bar内容2", "kore": "kore999" }, { "foo": "foo内容3", "bar": "bar内容3" } ]