【问题标题】:Postgres set jsonb field with columns from the same tablePostgres 将 jsonb 字段设置为同一张表中的列
【发布时间】:2022-01-20 11:43:09
【问题描述】:

我正在尝试将数据从几列移动到单个 JSONB 列。

例如,我有这样的 x,y,z 列:

id | x | y | z | data
---------------------
1  | 1 | 2 | 3 | NULL
2  | 4 | 5 | 6 | NULL
3  | 7 | 8 | 9 | NULL

我也想这样:

id | x | y | z | data
---------------------
1  | 1 | 2 | 3 | {"x":1, "y":2, "z": 3}
2  | 4 | 5 | 6 | {"x":4, "y":5, "z": 6}
3  | 7 | 8 | 9 | {"x":7, "y":8, "z": 9}

我尝试使用 jsonb_set 和 jsonb_insert 失败。我正在使用 postgresql 14。

【问题讨论】:

  • select id, x,y,z, jsonb_build_object('x', x, 'y', y, 'z', z) AS data from your_table

标签: postgresql jsonb


【解决方案1】:

您可以将整行转换为 json 值,然后删除 id

select t.*,
       to_jsonb(t) - 'id' as data
from the_table t;

【讨论】:

  • 你忘了减去“数据”:)
  • @Stefanov.sm:我认为它应该是 SELECT 中的一个新列,而不是表中的现有列。
【解决方案2】:

好的,感谢@Edouard,我已经进行了查询:

UPDATE table SET data = jsonb_build_object('x', x, 'y', y, 'z', z);

【讨论】:

    【解决方案3】:

    @a_horse_with_no_name 解决方案的update 版本:

    update the_table set data = to_jsonb(the_table.*) - 'id' - 'data';
    

    jsonb_build_object 方法不同,它可以在不改变任何数量的列的情况下工作,除了iddata

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 2019-11-20
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多