postgres:查找与数组中的值匹配的嵌套json值

postgres:查找与数组中的值匹配的嵌套json值,json,postgresql,Json,Postgresql,我有一个产品表,其中数据是一个jsonb字段。 内部的JSON如下所示: { id: 1, name: "Paper", locations: [ {locationId: 111, x: 1, y:1}, {locationId: 210, x: 27, y:86}, {locationId: 140, x: 34, y:134}, ] } 我有一个查询,返回至少一个位置id与给定id匹配的产品 SELECT id FROM

我有一个产品表,其中
数据
是一个jsonb字段。 内部的JSON如下所示:

{
  id: 1,
  name: "Paper",
  locations: [
     {locationId: 111, x: 1, y:1},
     {locationId: 210, x: 27, y:86},
     {locationId: 140, x: 34, y:134},
  ]
}
我有一个查询,返回至少一个位置id与给定id匹配的产品

SELECT id FROM product WHERE product.data ->'locations' @> '[{"locationId: GIVEN_ID}]'

现在问题来了:我想对给定的\u ID\u列表的查询进行调整,以使我得到的所有产品中至少有一个locationId在给定的\u ID\u列表中。

对于OR条件,您需要取消对数组的测试,并将其与现有条件相结合

select p.id
from product p
where exists (select *
              from jsonb_array_elements(p.data -> 'locations') as x(item)
              where x.item ->> 'locationId' in ('1', '2', '3'));

  • 提取数组元素
  • 检查数组元素是否是列表的一部分(已转换为类型
    jsonb
    ,以便能够应用
    @>
    运算符)
  • 获取产品名称
  • 因为您可以在一个产品中匹配多个ID,所以必须消除这些重复项
  •    SELECT DISTINCT                                                   -- 4
            mycol ->> 'name'                                             -- 3
        FROM
            mytable,
            json_array_elements(mycol -> 'locations') as elements        -- 1
        WHERE '[111, 210]'::jsonb @> (elements -> 'locationId')::jsonb   -- 2