SQL WHERE子句添加OR条件后Jurisdiction筛选失效问题
问题根因
SQL中AND运算符的执行优先级高于OR,原查询的WHERE条件实际被解析为以下逻辑:
满足「Jurisdiction以Sector 5开头、响应时间在2022年1月1日之后、Problem为Building / Security Check-LCL」,或者 Problem为Park and Walk-LCL的所有记录
这就导致只要Problem匹配第二个值,不管Jurisdiction和时间是否符合要求都会被返回,和预期的「Sector 5管辖范围+时间范围+两个Problem任意匹配」的逻辑不符。
修改方案
将所有通过OR关联的Problem匹配条件用圆括号包裹,使其成为一个独立的筛选整体,再和Jurisdiction、Response_Date的筛选条件做AND关联即可。
保留原LIKE写法的修正SQL
SELECT TOP (100000) [Master_Incident_Number] ,[Response_Date] ,[Problem] ,[Location_Name] ,[Address] ,[Apartment] ,[City] ,[Jurisdiction] ,[MethodOfCallRcvd] ,[Call_Disposition] ,[CallTaking_Performed_By] ,[CallClosing_Performed_By] FROM [Reporting_System].[dbo].[Response_Master_Incident] WHERE Jurisdiction LIKE 'Sector 5%' AND Response_Date >= '2022-01-01 00:00:00.000' AND ( Problem LIKE 'Building / Security Check-LCL' OR Problem LIKE 'Park and Walk-LCL' )
优化写法
当前Problem的匹配规则没有带任何通配符(%、_等),本质是精确匹配,这种场景直接用IN替换多个OR LIKE,可读性和执行效率都更高:
SELECT TOP (100000) [Master_Incident_Number] ,[Response_Date] ,[Problem] ,[Location_Name] ,[Address] ,[Apartment] ,[City] ,[Jurisdiction] ,[MethodOfCallRcvd] ,[Call_Disposition] ,[CallTaking_Performed_By] ,[CallClosing_Performed_By] FROM [Reporting_System].[dbo].[Response_Master_Incident] WHERE Jurisdiction LIKE 'Sector 5%' AND Response_Date >= '2022-01-01 00:00:00.000' AND Problem IN ( 'Building / Security Check-LCL', 'Park and Walk-LCL' )
编写SQL筛选条件的注意点
- 混合使用
AND和OR时,必须用圆括号明确OR关联条件的作用范围,避免运算符优先级导致的逻辑偏差 - 没有通配符的
LIKE等价于精确匹配=,这类场景优先使用=或IN,性能更优
内容的提问来源于stack exchange,提问作者WGraulich
相关产品推荐
相关产品推荐

