postgresql 对jsonb数组postgres的每个元素进行严格的条件检查

xytpbqjk  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(3)|浏览(181)

我的postgres数据库中有一个表master_data_approval_table,字段approval_value(类型为Jsonb)包含以下结构:
x1c 0d1x的数据
我们只需要那些jsonb数组的每个对象严格匹配给定条件**“status”的记录:“核准”**
预期O/P:



我尝试了不同的查询,但没有找到确切的查询来获得预期的输出。请帮我拿这个。
先谢了。

uplii1fm

uplii1fm1#

首先展平JSONB字段,然后执行例程选择。

select mdat.* from master_data_approval_table mdat
cross join lateral jsonb_array_elements(approval_value) as l
group by id 
having count(*) filter (where l ->> 'status' = 'Approved') = count(*);

字符串
我假设master_data_approval_table.id是主键。如果不是,则在上述查询中将select mdat.*替换为select mdat.id
DB Fiddle的数据。

k4ymrczo

k4ymrczo2#

SELECT approval_value
FROM master_data_approval_table
WHERE NOT EXISTS (
   SELECT 1
   FROM jsonb_array_elements(approval_value) arr
   WHERE arr->>'status' <> 'Approved'
);

字符串
jsonb_array_elements函数将把jsonb数组展开为单独的行,然后可以根据条件过滤这些行。
此查询将返回master_data_approval_table中的行,其中jsonb数组中的所有对象都具有“status”:“批准”

laximzn5

laximzn53#

你想要的是
第一个月
出于某种原因,如果你试图选择json_field->>'json_object',你会得到一个错误,所以你需要(有点冗余)将你的json字段转换为json。

相关问题