You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:20:28