当前位置: 首页 > 知识库问答 >
问题:

如何在jsonb列中动态更新数组中的所有值?

薛楷
2023-03-14

我正在节点中使用knex。PostgreSQL数据库上的js项目。将使用knex.schema。raw(原始SQL)来实现这一点。

我需要更新jsonb列中json对象的“grades”数组中等级名称(“1st”等)的所有实例。“grades”是整个json对象中的一个值,这是一个教训。

数组当前包含类似于“grades”的内容:[“Pre-K”,“K”,“4th”,“5th”,“6th”,“7th”,“8th”],它需要变成“grades”:[“PK”,“K”,“4”,“5”,“6”,“7”,“8”]。

基本上我需要

[“Pre-K”、“K”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”、“12”]

要成为

[“PK”,“K”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“11”,“12”]

有没有办法检查jsonb数组的内容,获取等级的索引,并用所需的等级更新该索引?还是另一种在jsonb类型列中转换数组数据的方法?

(我最初的想法是创建一个["Pre-K","K","1",2","3","4","5","6","7","8","9","10","11","12"]组合的每个排列列表,然后从存在的数据中替换出所需的数组,但这似乎有点笨拙,尽管在技术上是可能的。不过,有了这个,我仍然需要在jsonb cell中找到数组中项目的索引。)

共有1个答案

丌官飞章
2023-03-14

使用正则表达式消除冗余子字符串。

update my_table
set json_col = jsonb_set(
        json_col, 
        '{grades}', 
        (
            select jsonb_agg(regexp_replace(value, 're-|st|nd|rd|th', ''))
            from jsonb_array_elements_text(json_col->'grades')
        )
    );

db

一个更简单、更快的版本(尽管可能会被认为有点杂乱无章):

update my_table
set json_col = jsonb_set(
        json_col,
        '{grades}',
        regexp_replace(json_col->>'grades', 're-|st|nd|rd|th', '', 'g')::jsonb
    )

阅读有关POSIX正则表达式的更多信息。

 类似资料:
  • 我有如下jsonb专栏: 现在,我需要更新行,并将类似的文本数组放入字段。到目前为止我所尝试的: 是jsonb列 但它返回一个错误: 错误:函数jsonb_set(jsonb,unknown,integer[],boolean)不存在 提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。 附注: 我正在使用PostgreSQL 10

  • 如何更新JSONB以将新键添加到所有记录的嵌套数组(用于数组的所有项目)中。 我指的是表结构的链接: 给定的json是: 要将新元素添加到每个数组项中,请执行以下查询: 执行上述查询后输出: 但是上面只会在id=1的地方更新json。对于orders中的所有行,需要进行哪些更改才能更新与上述相同的JSON?

  • 我有一个带有jsonb列的PostgreSQL表,其中包含一个字符串数组,这些字符串是标记值,如下所示:。我有一个自定义绑定,用于将JSON与jackson JSONode进行转换。 自定义绑定定义如下:https://gist.github.com/helgeg/0C0B14228F75E91B7542BD6979A05B49 用基本的find读取记录,然后我提取JSON列,如下所示: 这是使用

  • 问题内容: 我正在尝试仅更新数组状态中的一个元素,但不确定如何执行此操作。 State 设定状态 如果我想更改标记的第四个元素中的键,该怎么做? 谢谢 问题答案: 重要的一点是,我们不应该直接更改状态数组,而要始终在新数组中进行更改,然后使用setState更新状态值。 如 Doc 建议: 切勿直接更改this.state,将this.state视为不可变。 更新状态数组的基本流程是: 1- 首先

  • 问题内容: 比方说,我已经有一个数组的是。我希望对象的所有字段在一行中都为“ false ”而不循环。那可能吗? 问题答案: 您只需要使用方法迭代数组并使用数组索引来更新其element属性:

  • 问题内容: 我想更新一个数组值,但我不确定要执行的正确方法,因此我尝试了以下方法,但没有为我工作。 我的模型,我模型中的子域 我的查询 谁能给我帮助。谢谢。 问题答案: 你不能同时使用 ,并 在相同的更新表达式作为嵌套的运营商。 使用更新运算符的正确语法如下: 在那里可以来自任何指定的更新列表运营商的位置。 要将一个新元素添加到数组中,只需一个 运算符即可,例如,您可以使用 update方法将修改