在PostgreSQL中查询JSON数组元素匹配
PostgreSQL的JSON数据类型在查询嵌套数组中的特定元素时可能比较棘手。考虑以下示例:
<code>{ "objects": [{"src":"foo.png"}, {"src":"bar.png"}], "background":"background.png" }</code>
为了查询“objects”数组中“src”值匹配“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中文网其他相关文章!