PostgreSQL中如何移除JSONB嵌套字段Identifier的"ABC-"前缀?
正确解决方案
首先明确你原UPDATE语句的核心错误:
- 错误地对路径字符串
'Content.Operating.Identifier'执行replace操作,而非提取jsonb字段中该路径对应的实际值 - 后续的
::jsonb ? '...'逻辑完全偏离需求,这是检查jsonb对象是否包含指定键的操作符,和更新字段内容无关
以下是两种可行的正确写法:
方法1:使用jsonb_set(兼容PostgreSQL 9.5+)
UPDATE "tbleName" SET "columnName" = jsonb_set( "columnName", '{Content,Operating,Identifier}', to_jsonb(replace(("columnName" -> 'Content' -> 'Operating' ->> 'Identifier'), 'ABC-', '')) ) WHERE "columnName" -> 'Content' -> 'Operating' ? 'Identifier' AND ("columnName" -> 'Content' -> 'Operating' ->> 'Identifier') LIKE 'ABC-%';
代码说明:
jsonb_set:用于精准更新jsonb字段指定路径的值,参数依次为原字段、路径数组(用大括号包裹层级键名)、新值(必须为jsonb类型)("columnName" -> 'Content' -> 'Operating' ->> 'Identifier'):通过->>提取该路径对应的文本值(若用->则返回jsonb类型,无法直接用replace)replace(...):移除文本值中的ABC-前缀to_jsonb(...):将处理后的文本转为jsonb类型,匹配jsonb_set的参数要求- WHERE子句:仅更新存在目标键且值以
ABC-开头的行,避免无意义的更新操作
方法2:使用jsonb_path_set(PostgreSQL 12+支持)
如果你的PostgreSQL版本是12及以上,也可以用JSON路径语法实现:
UPDATE "tbleName" SET "columnName" = jsonb_path_set( "columnName", '$.Content.Operating.Identifier', to_jsonb(replace(jsonb_path_query_text("columnName", '$.Content.Operating.Identifier'), 'ABC-', '')) ) WHERE jsonb_path_exists("columnName", '$.Content.Operating.Identifier ? (@ like_regex "^ABC-")');
代码说明:
jsonb_path_set:通过JSON路径表达式定位并更新值jsonb_path_query_text:提取路径对应的文本值jsonb_path_exists:过滤出符合条件的行,确保值以ABC-开头
内容的提问来源于stack exchange,提问作者Ashwini GUPTA
相关产品推荐
相关产品推荐

