如何过滤JSON数组并返回新字段

clj7thdc  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(128)

状态:[{"可见":true,"状态":1},{"可见":假,"状态":2},{"可见":true,"状态":2}]
新状态:[{"可见"(_V):true,"状态":1},{"可见":true,"状态":2}]
SELECT json_each(状态)FROM订单;

xwbd5t1u

xwbd5t1u1#

备选办法1

select json_agg(jsondata) from 
json_array_elements('[{"is_visible": true,"status": 1}, {"is_visible": false, "status": 2},{"is_visible": true,"status": 2}]'::json) t1(jsondata)
where t1.jsondata->>'is_visible' = 'true'

-- RESULT: 
[{"is_visible": true,"status": 1}, {"is_visible": true,"status": 2}]

备选办法2

with t1 (id, jsondata) as 
(
    select 1, '[{"is_visible": true,"status": 1},{"is_visible": false, "status": 2},{"is_visible": true,"status": 2}]'::json
    union all
    select 2, '[{"is_visible": true,"status": 3},{"is_visible": false, "status": 4},{"is_visible": false,"status": 5}]'::json
) 
select t1.id, json_agg(t2.val) from t1 
cross join json_array_elements(t1.jsondata) t2(val)
where t2.val->>'is_visible' = 'true'
group by t1.id 

-- RESULT:
id | json_agg                                                             |
---+----------------------------------------------------------------------+
 1 | [{"is_visible": true,"status": 1}, {"is_visible": true,"status": 2}] |
 2 | [{"is_visible": true,"status": 3}]   

                            |

相关问题