SQL查询OR条件逻辑错误返回已删除记录的排查与修正
问题原因
SQL逻辑运算符中AND的优先级高于OR,你写的WHERE条件没有对或逻辑做显式分组,实际执行逻辑等价于:
(name='John' AND Deleted=0 AND ID=7896 AND annonomous=1) OR showuser=1
这就导致showuser=1的判断不受前面的用户名、删除状态、ID条件约束——只要表中存在showuser=1的记录,不管是不是John、有没有被删除、ID是否匹配,都会被查出来。如果书写时条件顺序有偏差,annonomous=1的判断也可能跳过删除状态等过滤规则,最终返回你看到的已删除无效记录。
正确写法
你需要用括号将两个互斥布尔字段的或判断包裹为一个整体条件,让所有基础过滤规则(用户名、删除标记、ID)先执行,再从符合基础规则的记录中筛选满足两个开关任意一个为真的条目。修正后的SQL如下:
SELECT * FROM `table` WHERE name = 'John' AND Deleted = 0 AND ID = 7896 AND (annonomous = 1 OR showuser = 1);
注意:
table是SQL标准保留关键字,作为表名使用时建议用反引号包裹,避免触发语法错误。
执行上述语句后,将只会返回你预期的、未被删除且showuser=1的John记录,完全匹配需求。
内容的提问来源于stack exchange,提问作者deanpillow
相关产品推荐
相关产品推荐

