如何过滤从PostgreSQL表的JSON列返回的json数组?

时间:2020-02-01 15:13:08

标签: sql json postgresql

我正在尝试从表中获取简化的(过滤后的)JSON数组

考虑以下示例

CREATE TABLE "public"."test_data" (
    "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
    "a_field" jsonb NOT NULL,
    PRIMARY KEY ("id")
);

INSERT INTO test_data (a_field) VALUES 
('[ {"id": 1, "value": 100}, {"id": 2, "value": 200}, {"id": 2, "value": 50} ]');

存储在test_data.a_field字段中的数据结构是{ id: number, value: number }个对象的数组。

鉴于上面的示例,我需要获取对象的特定id的数据,所以代替此

[ {"id": 1, "value": 100}, {"id": 2, "value": 200}, {"id": 2, "value": 50} ]

我能得到这个吗?

[ {"id": 2, "value": 200}, {"id": 2, "value": 50} ]

请帮助。

1 个答案:

答案 0 :(得分:2)

您可以连续使用jsonb_array_elements()jsonb_agg()函数:

SELECT jsonb_agg(js) as a_field_new
  FROM
  (
   SELECT jsonb_array_elements(a_field) as js
     FROM test_data
  ) q
 WHERE js->> 'id' = '2'

不带子查询的OR:

SELECT jsonb_agg(value) as a_field_new 
  FROM test_data
 CROSS JOIN jsonb_array_elements(a_field)
 WHERE value->> 'id' = '2' 

Demo