Arrays 如何在jsonb列中动态更新数组中的所有值?
我正在PostgreSQL数据库的node.js项目中与knex合作。将使用knex.schema.raw(原始SQL)来完成此任务 我需要在jsonb列中的json对象的“grades”数组中更新等级名称(“1st”等)的所有实例。“grades”是整个json对象中的一个值,这是一个教训 数组当前包含以下内容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”] 基
“等级”:[“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
)