ぷっぽプログラミング備忘録

linux, javascript, php, C#, そのうちScalaとかアプリ開発とかやってみたいです。

postgresql 中身が配列になっているjsonb型の検索

前提

[
    {
        "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"
    }
]