如何使用来自 PostgreSQL 中另一个表列的值更新 JSONB 列

Bog*_*art 6 postgresql jsonb

我有一个源表,如下所示:

公共源代码

Id | part_no | category
1 | 01270-4 | Landscape
2 | 01102-3 | Sports
Run Code Online (Sandbox Code Playgroud)

然后,我有带有 jsonb 列(组合)的目标表,其列表如下;

公共目标

Id | part_no | combinations
7 | 01270-4 | {"subject":""}
8 | 01102-3 | {"subject":""}
Run Code Online (Sandbox Code Playgroud)

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

Id | part_no | combinations
7 | 01270-4 | {"subject":"Landscape"}
8 | 01102-3 | {"subject":"Sports"}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Poo*_*oya 9

您应该使用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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用示例结构来连接和更新两个 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
Run Code Online (Sandbox Code Playgroud)

  • 完美的!非常感谢普亚。你就是那个男人! (2认同)