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

如何在PostgreSQL中批量更新损坏的JSON字面量字段?

批量修复JSON格式字段并提取值的解决方案

你的错误是因为部分iws_location记录的内容并非标准的{'address': 'xxx'}格式,比如直接是'DUQUE'这类纯文本。当你替换单引号为双引号后,得到的是"DUQUE"——这是一个JSON字符串而非JSON对象,此时用->> 'address'提取键值就会触发JSON语法错误,因为字符串类型不支持键提取操作。

下面提供两种可靠的解决方法:

方法一:用正则表达式直接提取(推荐,避免JSON转换风险)

通过正则匹配目标格式的字符串,直接提取address对应的值,无需转换JSON,兼容性更强:

UPDATE web_scraping.iws_info_web_scraping
SET iws_location = regexp_replace(iws_location, '^\{''address'': ''(.*?)''\}$', '\1')
WHERE iws_id >= 1
AND iws_location ~ '^\{''address'': ''(.*?)''\}$';
  • 正则^\{''address'': ''(.*?)''\}$精准匹配{'address': 'xxx'}格式的内容
  • \1引用匹配到的xxx部分,直接替换原字段值
  • WHERE条件确保只处理符合目标格式的记录,避免误改其他内容

方法二:用安全JSON转换处理(适用于PostgreSQL 12+)

利用TRY_CAST函数捕获JSON转换失败的情况,仅处理能合法转换为含address键的JSON对象的记录:

UPDATE web_scraping.iws_info_web_scraping
SET iws_location = TRY_CAST(replace(iws_location, '''', '"') AS json) ->> 'address'
WHERE iws_id >= 1
AND TRY_CAST(replace(iws_location, '''', '"') AS json) IS NOT NULL
AND TRY_CAST(replace(iws_location, '''', '"') AS json) ? 'address'
AND iws_location IS DISTINCT FROM TRY_CAST(replace(iws_location, '''', '"') AS json) ->> 'address';
  • TRY_CAST在转换失败时返回NULL,避免触发语法错误
  • ? 'address'判断JSON对象是否包含address键
  • 最后一个条件确保只更新需要修改的记录,避免无意义的写入

内容的提问来源于stack exchange,提问作者marshel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:50:33