java – 如何从SQL中比较两个逻辑表达式的条件?

我想要两个比较两个SQL where子句来检查条件是否相似.

在下面的示例中,SQL查询在where子句中具有相同的逻辑条件.什么操作告诉我两个条款条件在逻辑上是一样的?

这有什么REGEX吗?还有其他方法吗?

String Q3 = "select t1.ID as ID,t1.FIELD8 as I_RECHARGE_TYPE,t1.FIELD28 as I_RECHARGE_AMOUNT,t1.FIELD1 as I_ACTIVATION_DATE,t1.FIELD2 as I_MSISDN from INSTANT_CDR_0 as t1 where t1.FIELD2 = ? and ((((t1.FIELD8 IS NOT NULL  AND  t1.FIELD28 > 0) OR  DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') > '2016-05-21')) or ((DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') < '2015-12-03' OR ( t1.FIELD28 > 0 AND  t1.FIELD28 < 101))))";
String Q4 = "select t1.ID as ID,t1.FIELD1 as I_ACTIVATION_DATE,t1.FIELD8 as I_RECHARGE_TYPE,t1.FIELD28 as I_RECHARGE_AMOUNT,t1.FIELD2 as I_MSISDN from INSTANT_CDR_0 as t1 where t1.FIELD2 = ? and (((DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') > '2016-05-21' OR ( t1.FIELD8 IS NOT NULL  AND  t1.FIELD28 > 0))) or (((t1.FIELD28 > 0 AND  t1.FIELD28 < 101) OR  DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') < '2015-12-03')))"; 

如何比较((a = 2)和(b = 3))与((b = 3)和(a = 2))并弄清楚它们是否相同?

最佳答案 更简单的情况是,如果您拥有的所有字段都是布尔值.所以所有的逻辑表达式也都是布尔表达式.

你所拥有的将是试图找出两个布尔表达式是否相等的问题 – 也就是说,对于每个可能的输入,它们提供相同的答案.

这样做的一种方法可能是:让A为第一个表达式,B为第二个表达式,A和B为逻辑和两者.对于两个表达式是等效的,应用于所有可能输入的A和B必须为true.对于所有输入,这意味着不(A和B)必须为假.因此,最后一个问题变为Boolean satisfiability problem.这个问题询问,对于布尔表达式,是否存在至少一个输入赋值使其成立.如果有,那么你可以说这两个表达式不等同于我们的结构,否则你说它们是等价的.

好消息是有大量用于攻击该问题的工具,称为SAT解算器,用于大量工业应用(例如电路设计).

坏消息是问题是NP-complete.所以这真的很难.如果问题的设置不适合SAT求解器采用的通常的启发式方法,那么你将不得不等待一段时间才能得到你的结果(也许直到宇宙热死?).

更糟糕的消息是SAT求解器专注于布尔问题,而你有SQL数据类型,这是更普遍的问题.不幸的是,开发出解决这个问题的工具.

正如其他人所提到的,所有这一切都需要解析表达式.

根据您希望结果的精确程度,您可以执行以下操作:运行两个查询.如果它们提供相同的结果,则表示表达式是等效的.如果没有,说他们不是.你在这里有一种情况,你可以有误报,但没有误报.所以,如果你说两个表达不相等,那么这是事实,你不能否认,因为否则他们会提供相同的答案.但是,如果你说它们是等价的,那么它们实际上并非如此,你对数据很幸运.如果人们将来在表中添加更多数据,则两者将不相等.这里有一些数学,我不会在这个答案中草拟它,但是,如果一个人对输入表/表做出一些假设,并且一个表中也有足够的行,那么误报的可能性就是是的,你说两个表达式是等价的,而实际上它们不是,它们相当低 – 呈指数级.因此,如果你有1000行来测试这些东西,你可以非常肯定匹配是好的.

你也可以对表达式进行代数操作,试图将一个表达式转换为另一个表达式.从布尔表达式(DeMorgan规则,关联性,卡诺图等)可以应用它们中的一整套,这可能有助于找到一个精确的解决方案,特别是如果where子句很简单,但看起来更脆弱对我来说.

希望这可以帮助.确保订购查询结果,因此您不会丢弃真实匹配.

点赞