首页 > 解决方案 > 如何使用来自 PostgreSQL 中另一个表列的值更新 JSONB 列

问题描述

我有一个源表,其中列出如下:

公共资源

Id | part_no | category
1 | 01270-4 | Landscape
2 | 01102-3 | Sports

然后,我有带有 jsonb 列 (combinations) 的目标表,如下所示;

公共目标

Id | part_no | combinations
7 | 01270-4 | {"subject":""}
8 | 01102-3 | {"subject":""}

我的问题是 - 我如何使用来自使用 part_no 列的源表的值来更新带有 jsonb 列(组合)的目标表?
输出如:

Id | part_no | combinations
7 | 01270-4 | {"subject":"Landscape"}
8 | 01102-3 | {"subject":"Sports"}

我在下面尝试但给出错误:

UPDATE public.target t
SET combinations = jsonb_set(combinations,'{subject}','s.category',false)
FROM public.source s
WHERE s.part_no = t.part_no;

错误:json 类型的无效输入语法第 2 行:SET 组合 = jsonb_set(combinations,'{subject}','s.categor... ^ 详细信息:标记“s”无效。上下文:JSON 数据,第 1 行:s ... SQL 状态:22P02 字符:77

标签: postgresqljsonb

解决方案


您应该使用to_jsonb函数转换s.category为 JSON

演示

UPDATE public.target t
SET combinations = jsonb_set(combinations,'{subject}',to_jsonb(s.category),false)
FROM public.source s
WHERE s.part_no = t.part_no

或者您可以使用示例结构来连接和更新两个 JSON 字段:

演示

UPDATE public.target t
SET combinations = combinations || jsonb_build_object('subject', s.category)
FROM public.source s
WHERE s.part_no = t.part_no

推荐阅读