WHERE子句中双条件OR语句为何无查询结果?
两种WHERE子句逻辑的结果差异解析
问题场景
第一个查询使用OR连接两组AND条件,返回空结果:
SELECT date, -- 将主队标识为FC Barcelona或Real Madrid CF CASE WHEN hometeam_id = 8634 THEN 'FC Barcelona' ELSE 'Real Madrid CF' END AS home, -- 将客队标识为FC Barcelona或Real Madrid CF CASE WHEN awayteam_id = 8634 THEN 'FC Barcelona' ELSE 'Real Madrid CF' END AS away FROM matches_spain WHERE (awayteam_id = 8634 AND hometeam_id = 8634) OR (awayteam_id = 8633 AND hometeam_id = 8633);
而第二个查询用AND连接两组OR条件,能正常返回有效结果:
SELECT date, -- 将主队标识为FC Barcelona或Real Madrid CF CASE WHEN hometeam_id = 8634 THEN 'FC Barcelona' ELSE 'Real Madrid CF' END AS home, -- 将客队标识为FC Barcelona或Real Madrid CF CASE WHEN awayteam_id = 8634 THEN 'FC Barcelona' ELSE 'Real Madrid CF' END AS away FROM matches_spain WHERE (awayteam_id = 8634 OR hometeam_id = 8634) AND (awayteam_id = 8633 OR hometeam_id = 8633);
逻辑差异详解
第一个WHERE子句的逻辑缺陷
第一个条件的两组判断都是要求同一比赛的主队和客队是同一支球队:
(awayteam_id = 8634 AND hometeam_id = 8634):主队和客队都是巴萨(ID 8634),现实中不可能存在这样的赛事(awayteam_id = 8633 AND hometeam_id = 8633):主队和客队都是皇马(ID 8633),同样不可能存在
两个不可能成立的条件用OR连接,自然没有匹配的记录,所以返回空结果。
第二个WHERE子句的逻辑合理性
第二个条件的两组判断用AND连接,实际是筛选巴萨和皇马之间的对阵赛事:
- 第一组
(awayteam_id = 8634 OR hometeam_id = 8634):比赛中至少有一方是巴萨 - 第二组
(awayteam_id = 8633 OR hometeam_id = 8633):比赛中至少有一方是皇马
两者结合后,只会匹配两种真实存在的赛事:巴萨主场对阵皇马,或者皇马主场对阵巴萨,因此能从数据库中查询到有效记录。
内容的提问来源于stack exchange,提问作者KwesiM
相关产品推荐
相关产品推荐

