我有一个包含jsonb列的表,并且我希望将每条记录迁移到新的模式.

旧方案:{"foo": "bar"} 新计划:{"foo": {"value": "bar"}

bar值因行而异,我希望保留该值.我需要一些方法来从每条记录中查找foo的值.

WITH data AS (
  SELECT id AS id, col -> 'foo' AS foo
  FROM t
) UPDATE t SET col = jsonb_set('{"foo": {"value": ""}}', '{foo,value}', SELECT foo FROM data WHERE data.id = t.id);

我在Postgres 11.21中得到了这个错误.

ERROR:  syntax error at or near "SELECT"
LINE 4: ...jsonb_set('{"foo": {"value": ""}', '{foo,value}', SELECT foo...

推荐答案

不需要CTE,并且您可以无关子查询地移动当前内容:

UPDATE t 
SET col = jsonb_set(col, '{foo}', jsonb_build_object('value', col->>'foo'))
WHERE id = ?; -- if needed

Postgresql相关问答推荐

环境变量在Bash应用程序中没有出现

包含JSONB属性的过滤器的索引策略

让Docker Compose Container等待容器PostgreSQL并恢复

如何将特定值排序为最后,其余记录按 id DESC 排序?

如何在postgresql中按时间查询

推送到 Heroku 时出现带有 Postgres 的 Rails 迁移错误

Postgres COPY FROM csv file-No such file or directory

无法向 postgresql 数据库授予用户权限(对于 rails 应用程序)

如何使用 SpringBoot + JPA 存储 PostgreSQL jsonb?

使用 postgres regexp_replace 将字符串列表替换为始终相同的字符串

判断值是否存在于列中

使用 current_setting() 判断值

由于外键约束无法删除对象

是否可以在 CSV 格式的 Postgres COPY 命令中关闭报价处理?

如何在 postgresql 交叉表中用零替换空值

有没有办法确保 WHERE 子句在 DISTINCT 之后发生?

如何从 PostgreSQL 中的 Json 数组中获取元素

如何查询前 10 行,下一次从表中查询其他 10 行

错误:permission denied for language c

如何为本地 Rails 元素设置 Postgres 数据库?