我有一个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
答案 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;