线上环境测试时候,测试提了个bug 如下
SELECT
userid,
responsibility,
autograph,
dtno,
origanize
FROM
T_AMS_RECORDFILE
WHERE
origanizeIN ( '局领导1', '局领导2', '局领导3', '局领导4' )
AND userid = '1'
AND responsibility LIKE '%2%'
OR autograph LIKE '%2%'
OR dtno LIKE '%2%'
情景还原 :
数据表里只有40多条数据在查询时有80多条数据
查询条件:输入条件统一做用于 3个字段上
解决方法:
SELECT
userid,
responsibility,
autograph,
dtno,
origanize
FROM
T_AMS_RECORDFILE
WHERE
origanizeIN ( '局领导1', '局领导2', '局领导3', '局领导4' )
AND userid = '1'
AND (responsibility LIKE '2%'
OR autograph LIKE '2%'
OR dtno LIKE '2%')
其中like 左边通配符去掉了,防止索引失效 !
既然解决了那总要知道是什么原因导致
我建议在两个逻辑标准集(更重要的是OR部分)周围添加括号。事实上,你完全信任行动的顺序,我不认为它决定了你想要的方式。括号应该可以做到
为什么会这样呢?
原因在于计算的次序。SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符。当 SQL 看到上述 WHERE 子句时,由于 AND 在计算次序中优先级更高,操作符被错误地组合了。
任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。