我正在维护一个遗留应用程序,其中 SQL 查询看起来像是魔鬼的手艺——在我放弃并重写整个该死的东西之前,我希望使用更好的工具来进行手术改变:)
我想知道当有很多OR
s 时哪个“WHERE”子句导致包含某些行。更好的是,为什么某些行被排除在结果集中。
(特别是我使用的是 MySQL)
将您的 where 条件移至 case 语句。将每个“或”分解成它自己的列,结果将显示返回真假。
我还没有听说过可以为您执行此操作的工具。
这是 Pirion 方法的一种变体。
而不是使用case语句,而是where
语句中的每个子句select
。所以,像这样的条件:
select t.*
from t
where A or B or C or D
会成为:
select t.*,
(Acomp) as A,
(Bcomp) as B,
(Ccomp) as C,
(Dcomp) as D
from t
where Acomp or Bcomp or Ccomp or Dcomp
MySQL 有一个很好的特性,布尔值返回为0
(false) 或1
(true)。这将允许您查看给定行匹配的所有条件。
然后,您可以通过删除或组合条件来简化逻辑。
如果条件是计算密集型或非常长的(例如使用子查询),您可能希望使用子查询来执行此操作:
select t.*
from (select t.*,
(Acomp) as A,
(Bcomp) as B,
(Ccomp) as C,
(Dcomp) as D
from t
) t
where A or B or C or D;