JSONB值中的PostgreSQL UPDATE列

时间:2019-04-15 00:10:01

标签: json postgresql sql-update

我有一个postgresql表,该表的列包含该行的jsonb数据。并非所有数据都从jsonb中提取出来以创建表,但我们希望将其存储,以防需要提取更多数据。

我们现在想从该行的jsonb中再拉一个字段,并创建一个新列来存储值。我所看到的示例似乎并未专门解决此问题,因此使我想仔细检查我的过程,看看是否有更简单的方法可以在PostgreSQL中做到这一点。

我的插入语句如下:

insert into companyTable (company_id)
    select company_object ->>'CompanyId'
        from companyTable

然后,这应该从jsonb company_obejct中提取值,并为表中的每一行插入列company_id中。这看起来正确吗,是他们完成这项任务的简便方法吗?

更新: 给定@ŁukaszKamiński语句,看来我不想UPDATE插入,因为INSERT添加了新行,而我只想更新已添加新列的行。因此,我相信这是我应该使用的代码。

update companyTable
set (company_id) =
    (select company_object ->>'CompanyId'
        from company.company)

而且,因为我不太了解UPDATE的上下文,所以应该将其放在循环中,以便使用该行的jsonb对象更新每一行吗?

例如(在更新之前):

id | col1 | company_object           | company_id
---|------|--------------------------|------------
1  | a    |{'b':1, 'company_id': 3}  |  NULL
2  | a    |{'b':2, 'company_id': 4}  |  NULL
3  | a    |{'b':3, 'company_id': 5}  |  NULL

(更新后)

id | col1 | company_object           | company_id
---|------|--------------------------|------------
1  | a    |{'b':1, 'company_id': 3}  |  3
2  | a    |{'b':2, 'company_id': 4}  |  4
3  | a    |{'b':3, 'company_id': 5}  |  5

1 个答案:

答案 0 :(得分:1)

您不需要为此进行子选择:

update companyTable
  set company_id = (company_object ->>'company_id')::int;

如果JSON包含空字符串,则需要“空化”它们:

update companyTable
  set company_id = nullif(trim(company_object ->>'company_id'), '')::int
where company_object ? 'company_id';

在线示例:https://rextester.com/UXQKG95245

由于没有提供where子句,因此将更新表中的所有行。


但是,我看不到重复该信息的原因。要么将其存储在company_id列中,要么将其存储在JSON值中,但是复制它很可能不是一个好主意,因为它很容易变得不同步。

创建视图可能是使此值易于访问的更好方法:

create view company_information
as
select id, col1, company_object, 
       company_object ->> 'company_id' as company_id
from company_table;