如何仅对存在header键的JSON数据执行SQL修改操作?
解决方案
要实现只处理含header键的对象(重命名键为test并设空值),同时保留已有test键的对象数据,你需要在解析JSON时同时识别header和test字段,再通过条件判断区分处理:
UPDATE Files SET Columns = ( SELECT test = CASE WHEN j.header IS NOT NULL THEN '' ELSE j.test END, j.value FROM OPENJSON(Columns) WITH ( header varchar(50), -- 解析原header字段 test varchar(50), -- 同时解析已存在的test字段 value varchar(50) ) j FOR JSON PATH, WITHOUT_ARRAY_WRAPPER -- 保持原数组结构 );
关键说明:
WITH子句同时声明header和test字段,确保不管JSON对象里是哪种键,都能被正确读取CASE表达式做分支处理:如果当前对象有header(即header IS NOT NULL),就把test设为空字符串;如果没有header,就保留原来的test值WITHOUT_ARRAY_WRAPPER保证生成的JSON和原结构一致,不会额外嵌套
之前方法的问题:
- 用
REPLACE只能替换键名字符串,无法精准修改对应的值,且会无差别替换所有"header":内容 - 你之前的OPENJSON脚本只解析了
header字段,不管原对象有没有test,都强制生成test='',导致原有test的值被覆盖
内容的提问来源于stack exchange,提问作者Sirth
相关产品推荐
相关产品推荐

