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

Arrays 如何在jsonb列中动态更新数组中的所有值?,arrays,json,postgresql,jsonb,Arrays,Json,Postgresql,Jsonb,我正在PostgreSQL数据库的node.js项目中与knex合作。将使用knex.schema.raw(原始SQL)来完成此任务 我需要在jsonb列中的json对象的“grades”数组中更新等级名称(“1st”等)的所有实例。“grades”是整个json对象中的一个值,这是一个教训 数组当前包含以下内容 “等级”:[“Pre-K”、“K”、“4th”、“5th”、“6th”、“7th”、“8th”]并且它需要变成“等级”:[“PK”、“K”、“4”、“5”、“6”、“7”、“8”] 基

我正在PostgreSQL数据库的node.js项目中与knex合作。将使用knex.schema.raw(原始SQL)来完成此任务

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

数组当前包含以下内容
“等级”:[“Pre-K”、“K”、“4th”、“5th”、“6th”、“7th”、“8th”]
并且它需要变成
“等级”:[“PK”、“K”、“4”、“5”、“6”、“7”、“8”]

基本上我需要的任何实例

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

将来

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

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


(我最初的想法是创建一个列表,列出
[“Pre-K”、“K”、“1st”、“2nd”、“3rd”、“4th”、“5th”、“6th”、“7th”、“8th”、“9th”、“10th”、“11th”、“12th”]
,只需将所需的数组从存在的数据中交换出去,但这似乎有点笨拙,尽管技术上可行。但是,有了这个,我仍然需要在jsonb单元格中找到数组中项的索引。)

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

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')
        )
    );

一个更简单、更快的版本(尽管可能会被认为有点黑客):


阅读更多关于

我不知道你的全部标准,但根据你发布的示例,你可以去掉任何小写字符?@ConnorBurton如果其中包含破折号,是的,那就行了。我该怎么做?(我将修改问题,以显示我有什么和我想要什么)不要尝试按索引进行更新。只需立即更新整个数组,比如jsonb列到底包含什么?一个具有
grades
属性的对象,还是普通数组?@Foureydraven我的建议是在JS中这样做,如果你想要一个查询解决方案,我不确定。在JS中,如果你得到普通数组,你可以执行
a.map(value=>value.replace(/[a-z-]/g',)
只需使用一些正则表达式来删除小写字母和连字符这太棒了,谢谢!!第一个很好用。很高兴了解更多关于操作jsonb数据的信息。
update my_table
set json_col = jsonb_set(
        json_col,
        '{grades}',
        regexp_replace(json_col->>'grades', 're-|st|nd|rd|th', '', 'g')::jsonb
    )