postgresql 我可以将jsonb_set与来自select语句的新值(第三个参数)一起使用吗?

alen0pnh  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(147)

我有一个带有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...

dbf7pr2w

dbf7pr2w1#

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

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

字符串

yzuktlbb

yzuktlbb2#

它需要在select周围加上括号:

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

字符串

相关问题