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
相关产品推荐
相关产品推荐

