首页 > 解决方案 > Postgres jsonb:查询多级

问题描述

在 Postgres (9+) 表中,有一列类型jsonb如下json

{
   "dynamicFields":[
      {
         "name":"040",
         "subfields":[
            {
               "name":"a",
               "value":"abc"
            },
            {
               "name":"a",
               "value":"xyz"
            }
         ]
      }
   ]
}

我想编写一个查询,只返回字段名称等于040和子字段a等于的行xyz

到目前为止,这是我所得到的:

select e.obj from my_table
cross join lateral jsonb_array_elements(my_column-> 'dynamicFields') as e(obj)
where e.obj ->> 'name' = '040' and e.obj ->> 'subfields' @> '{"name": "a", "value": "xyz"}'::jsonb

这个查询应该如何实现这一点?

标签: postgresql

解决方案


e.obj ->> 'subfields'text结果。您将希望使用e.obj -> 'subfields'它返回运算符工作的jsonb@>。此外,包含检查需要将另一个数组作为右侧,以便它测试右侧数组中的所有值是否都包含在左侧数组中 - 直接传递元素对象是行不通的。

select e.obj from my_table
cross join lateral jsonb_array_elements(my_column-> 'dynamicFields') as e(obj)
where e.obj ->> 'name' = '040' and e.obj -> 'subfields' @> '[{"name": "a", "value": "xyz"}]'::jsonb
--                                        ^                 ^                             ^

在线演示


推荐阅读