0

我正在维护一个遗留应用程序,其中 SQL 查询看起来像是魔鬼的手艺——在我放弃并重写整个该死的东西之前,我希望使用更好的工具来进行手术改变:)

我想知道当有很多ORs 时哪个“WHERE”子句导致包含某些行。更好的是,为什么某些行被排除在结果集中。

(特别是我使用的是 MySQL)

4

2 回答 2

3

将您的 where 条件移至 case 语句。将每个“或”分解成它自己的列,结果将显示返回真假。

我还没有听说过可以为您执行此操作的工具。

于 2013-07-09T19:54:56.230 回答
1

这是 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;
于 2013-07-09T20:47:29.843 回答