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

Oracle 19c中能否用JSON_MERGEPATCH原地更新指定JSON元素值?

可以使用JSON_MERGEPATCH实现该需求,但需修正语法错误

你的原语句问题在于直接将SQL表达式嵌入到了JSON字符串参数中,JSON_MERGEPATCH的第二个参数必须是合法的JSON格式数据,不能直接在JSON里写SQL的拼接逻辑。需要先计算出value的新值,再构造完整的补丁JSON对象。

正确的实现方式

方式1:使用JSON_OBJECT构造补丁(推荐,更易维护)

利用Oracle的JSON_OBJECT函数动态生成要合并的JSON补丁,直接在函数中处理value的拼接逻辑:

UPDATE test_table a
SET a.test_col = JSON_MERGEPATCH(
    a.test_col,
    JSON_OBJECT(
        'formatLabel' VALUE '0999999999',
        'value' VALUE '0' || JSON_VALUE(a.test_col, '$.value') || '000'
        FORMAT JSON
    )
)
WHERE JSON_VALUE(a.test_col, '$.formatLabel') = '999999'
  AND LENGTH(JSON_VALUE(a.test_col, '$.value')) = 6;
COMMIT;

方式2:拼接合法的JSON字符串

如果选择手动拼接JSON字符串,需确保生成标准JSON格式,注意单双引号的转义:

UPDATE test_table a
SET a.test_col = JSON_MERGEPATCH(
    a.test_col,
    '{"formatLabel":"0999999999","value":"' || '0' || JSON_VALUE(a.test_col, '$.value') || '000' || '"}'
)
WHERE JSON_VALUE(a.test_col, '$.formatLabel') = '999999'
  AND LENGTH(JSON_VALUE(a.test_col, '$.value')) = 6;
COMMIT;

验证更新结果

执行更新后,可通过以下语句确认数据符合预期:

SELECT 
    JSON_VALUE(test_col, '$.formatLabel') AS formatLabel,
    JSON_VALUE(test_col, '$.value') AS value,
    LENGTH(JSON_VALUE(test_col, '$.value')) AS value_length
FROM test_table
WHERE JSON_VALUE(test_col, '$.formatLabel') = '0999999999';

预期结果中,formatLabel应为0999999999,value应为0345345000,长度为10。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:15:07