PostgreSQL で一致する JSON 配列要素をクエリします
PostgreSQL の JSON データ型は、ネストされた配列内の特定の要素をクエリする場合に扱いにくい場合があります。次の例を考えてみましょう:
<code>{ "objects": [{"src":"foo.png"}, {"src":"bar.png"}], "background":"background.png" }</code>
「src」値が「objects」配列内の「foo.png」と一致するレコードをクエリするには、FROM 句で横結合を使用できます。
PostgreSQL 9.3 以降
PostgreSQL 9.3 以降の場合は、json_array_elements()
関数を使用して「objects」配列を展開し、各要素をテストします。
<code class="language-sql">SELECT data::text, obj FROM reports r, json_array_elements(r.data#>'{objects}') obj WHERE obj->>'src' = 'foo.png';</code>
PostgreSQL 9.4 以降
PostgreSQL 9.4 以降では、jsonb_array_elements()
関数を使用して、式に一致する GIN インデックスを作成する必要があります:
<code class="language-sql">CREATE INDEX reports_data_gin_idx ON reports USING gin ((data->'objects') jsonb_path_ops); SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';</code>
配列のマッチングでは要素を角括弧で囲む必要がありますが、通常のオブジェクトのマッチングでは角括弧は必要ないことに注意してください。詳細と回避策については、質問に記載されているリンク先のドキュメントとその他のリソースを参照してください。
以上がPostgreSQL で JSON 配列要素の一致をクエリする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。