PostgreSQL jsonb []迁移重命名属性

时间:2018-04-18 16:46:55

标签: sql postgresql database-migration jsonb

我有一个名为menu_items的数据库表,其中包含一个名为jsonb[]的{​​{1}}字段。 build_items数组中的对象是一个名为build_items的字段,我需要将其重命名为item_id

我找到了这篇文章(PostgreSQL rename attribute in jsonb field),它描述了我的问题,除了我需要它来为数组中的每个元素工作。

这个操作只能使用PostgreSQL,还是需要编写一些代码来提取数据,更改数据,然后更新表格?

我还尝试将value转换为jsonb[]并执行TEXT,然后尝试将其转换回REPLACE值。结果(以查询形式)是正确的,但我不确定如何使用结果更新jsonb[]中的正确行。

menu_items

2 个答案:

答案 0 :(得分:1)

让我们说你有:

t=# create table so13 as with j(a) as (values('{"q":0}'::jsonb),('{"b":1}'::jsonb))
, jba as (select array_agg(a) ar from j)
select ar,pg_typeof(ar) from jba;
SELECT 1
t=# select * from so13;
             ar              | pg_typeof
-----------------------------+-----------
 {"{\"q\": 0}","{\"b\": 1}"} | jsonb[]
(1 row)

然后你首先需要取消jsonb []:

t=# with p as (
  select unnest(ar) m from so13
)
select m, m - 'b' || jsonb_build_object('q',coalesce(m->'b',m->'q')) from p;
    m     | ?column?
----------+----------
 {"q": 0} | {"q": 0}
 {"b": 1} | {"q": 1}
(2 rows)

然后将其换回:

t=# with p as (
  select unnest(ar) m from so13
)
select array_agg(m - 'b' || jsonb_build_object('q',coalesce(m->'b',m->'q'))) from p;
          array_agg
-----------------------------
 {"{\"q\": 0}","{\"q\": 1}"}
(1 row)

答案 1 :(得分:0)

Vao在接受的答案中回答了我的问题。以下是任何未来用户的完整更新命令。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id='R1'>Click R1</button>
<button id='R2'>Click R2</button>
<button id='R3'>Click R3</button>
<button id='R4'>Click R4</button>
<button id='R5'>Click R5</button>