如何将 jsonb 对象转换为对象数组?

How to transform jsonb object to an array of objects?

来自这里:

 "data": {
           "media_object_uuid": ["5171167e-c109-4926-9606-5212ee250e2f"]
         }

对此:

        "data": {
                  "media_object":[{"media_object_uuid": "5171167e-c109-4926-9606-5212ee250e2f"]
                }

换句话说,我想提取这个数组的第一个值并将其设置在media_object 内的新字段media_object_uuid 上。我解决这个问题的方法是:

update demo_test set data = jsonb_set(data,'{media_object_uuid}',('{"media_object": { "media_object_uuid":' || (data->"media_object_uuid"[0])::text || '}}'));

但是我在returnmedia_object_uuid栏中不存在

我认为您需要将 data->"media_object_uuid" 称为 data->'media_oject_uuid',因为在 Postgres 中,double-quotes 用于引用 column/entity 名称(除非它们首先封装在single-quotes):

edb=# create table abc (data jsonb);
CREATE TABLE
edb=# insert into abc values ('{
edb'#            "media_object_uuid": ["5171167e-c109-4926-9606-5212ee250e2f"]
edb'#          }');
INSERT 0 1
edb=# select ('{"media_object": [{ "media_object_uuid":' || (data->'media_object_uuid')::text || '}]}') from abc;
                                      ?column?                                       
-------------------------------------------------------------------------------------
 {"media_object": [{ "media_object_uuid":["5171167e-c109-4926-9606-5212ee250e2f"]}]}
(1 row)

edb=# update abc set data = jsonb_set(data,'{media_object_uuid}', ('{"media_object": [{ "media_object_uuid":' || (data->'media_object_uuid')::text || '}]}')::jsonb);
UPDATE 1
edb=# select * from abc;
                                                    data                                                    
------------------------------------------------------------------------------------------------------------
 {"media_object_uuid": {"media_object": [{"media_object_uuid": ["5171167e-c109-4926-9606-5212ee250e2f"]}]}}
(1 row)