如何修正SQL WHERE语句中AND/OR逻辑优先级错误问题
问题原因
根本原因是SQL中AND运算符优先级高于OR,你原语句的括号分组错误,导致长度判断脱离了对应的reportType约束:
- 原语句
(reportType = 1 and LEN(descriptionCode) = 4 OR LEN(descriptionCode) = 1)实际执行逻辑为:(reportType=1 且 长度=4) 或者 长度=1,只要长度为1,不管reportType是什么都会命中 - 后半段
(reportType = 2 and LEN(descriptionCode) < 3 OR LEN(descriptionCode) > 5)实际执行逻辑为:(reportType=2 且 长度<3) 或者 长度>5,只要长度大于5,不管reportType是什么都会命中
你提到的id=14的记录就是因为长度为7>5,命中了后半段的无约束长度条件,所以被错误返回。
修正后的查询语句
把每个reportType对应的所有长度条件用括号整体包裹,确保长度判断只对对应reportType生效:
SELECT * FROM tblReportDescription WHERE (reportType = 1 AND (LEN(descriptionCode) = 4 OR LEN(descriptionCode) = 1)) OR (reportType = 2 AND (LEN(descriptionCode) < 3 OR LEN(descriptionCode) > 5))
验证结果
执行修正后的语句,返回结果完全符合需求:
- reportType=1的记录仅返回id为34(长度4)、21(长度1)、8(长度4)的3条符合规则的记录
- reportType=2的记录仅返回id为3(长度6>5)、13(长度2<3)、9(长度2<3)的3条符合规则的记录
错误的id=14记录不会被返回。
内容的提问来源于stack exchange,提问作者stepheniok
相关产品推荐
相关产品推荐

