【问题标题】:PostgreSQL UPDATE column from JSONB value来自 JSONB 值的 PostgreSQL UPDATE 列
【发布时间】:2019-09-04 23:04:53
【问题描述】:

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

我们现在想从行中的 jsonb 中再提取一个字段并创建一个新列来存储该值。我看到的示例似乎没有具体解决这个问题,因此我想仔细检查我的过程,看看在 PostgreSQL 中是否有更简单的方法。

我的插入语句如下所示:

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

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

更新: 鉴于@Łukasz Kamiń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

【问题讨论】:

  • 向我们展示您的完整 json 并告诉我们您希望在插入后在目标表中看到什么。
  • 这听起来像你想做更新。还是您真的想要companyTable 中的 行?
  • @ŁukaszKamiński 我不想要一个新行 我想为现有行的新列 company_id 添加一个值。

标签: json postgresql sql-update


【解决方案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;

【讨论】:

  • @a-horse-with-no-name 目的是让从该表中提取数据的数据科学家可以轻松访问数据。鉴于此::int,这是要将其转换为整数吗?此外,该代码给出了invalid input syntax for integer 错误。感谢您的帮助。
  • @Prof.Falken:是的,::int 是一个演员。如果您收到该错误,则表示并非所有 JSON 值都在该键处包含有效整数。您是否知道每次表中的数据发生更改时都需要更新该列?为数据科学家创建视图可能更容易
  • @a-horse-with-no-name 数据每季度刷新一次,我们将在未来将这些新列添加到刷新中。除非我在这里遗漏了什么。关于错误,jsonb中的某些条目有空值,有没有办法通过这个错误,即忽略空值?
  • @Prof.Falken:真正的空值是可以的,请参阅here 您可能有空字符串(请参阅我的编辑以获取处理该问题的解决方案)。或不同的键(您在问题中的示例数据使用company_idCompanyId 作为键。
  • @a-horse-with-no-name 一些存储的 JSONb 没有 company_id 字段,因此它不存在。我应该添加where 声明吗?不知道如何解决这个问题。另外,感谢create view 的建议。我会和我的团队谈谈,看看这是否是可以追求的。
猜你喜欢
  • 2017-05-25
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多