在SQL UPDATE语句的WHERE子句中使用CASE根据DesignType列值匹配JSON_VALUE结果时出现语法错误的技术问询
解决SQL中CASE WHEN导致的语法错误问题
我一眼就发现问题啦——你的CASE表达式少了一个闭合的右括号,这直接打乱了WHERE子句的语法结构,数据库引擎没法正确解析后面的@minimumLengthForJsonContainingDates条件。另外还有个小细节:LEN(value)里的value没有明确指定是components.value,虽然有时候能正常运行,但明确引用会避免歧义,让代码更清晰。
修正后的完整SQL代码
UPDATE MyThing SET BeginCheckDate = JSON_VALUE(components.value, '$.values[1]') FROM [dbo].[MyThing] e INNER JOIN MyThingData ed ON e.Id = ed.MyThingId CROSS APPLY OPENJSON (ed.Content, '$.views[0].sections[0].components') components WHERE ISJSON(ed.Content) > 0 -- 修正后的问题相关部分 AND (JSON_VALUE(components.value, '$.id') = CASE WHEN e.DesignType = 'Change Compensation' THEN @compensationBeginCheckDateId WHEN e.DesignType = 'Change Leave of Absence' THEN @leaveOfAbsenceBeginCheckDateId WHEN e.DesignType = 'Change Position' THEN @positionBeginCheckDateId WHEN e.DesignType = 'Change Reactivate' THEN @reactivateBeginCheckDateId WHEN e.DesignType = 'Change Rehire' THEN @rehireBeginCheckDateId WHEN e.DesignType = 'Change Termination' THEN @terminationBeginCheckDateId END) -- 补上缺失的右括号 AND LEN(components.value) > @minimumLengthForJsonContainingDates -- 明确指定components.value
关键修正点
- 闭合CASE表达式的括号:在CASE语句的END后面添加了
),和前面的(对应,让WHERE子句的逻辑分组清晰,数据库能正确解析后续条件。 - 明确引用JSON值:把
LEN(value)改成LEN(components.value),避免因为作用域问题导致的潜在错误,代码可读性也更强。
你可以运行修正后的代码试试,应该就能解决那个语法错误提示了。
内容的提问来源于stack exchange,提问作者Andrio
相关产品推荐
相关产品推荐

