是否有任何方法可以比较两个sql字符串以检查它们在语义上是否等效?

是否有任何方法可以比较两个sql字符串以检查它们在语义上是否等效?,sql,oracle,parsing,jdbc,Sql,Oracle,Parsing,Jdbc,我正在编写一些Java单元测试,我需要比较两个sql字符串,其中sql语句在语义上是等价的,但在语法上可能不同。我无法进行字符串比较,因为from子句和where子句的顺序可能不同,但这两个查询可能是等效的 在java中,是否可以不用编写自己的Oracle SQL解析器就可以做到这一点 另外,查询可能非常复杂 谢谢大家! 这不是问题的直接解决方案,但您可能希望了解哪些已经包含了您所需的部分内容。一般的答案是否定的,因为您总是可以调用某种隐藏图灵机的存储过程。 事实上,你可以在SQL语句中做算术运

我正在编写一些Java单元测试,我需要比较两个sql字符串,其中sql语句在语义上是等价的,但在语法上可能不同。我无法进行字符串比较,因为from子句和where子句的顺序可能不同,但这两个查询可能是等效的

在java中,是否可以不用编写自己的Oracle SQL解析器就可以做到这一点

另外,查询可能非常复杂


谢谢大家!

这不是问题的直接解决方案,但您可能希望了解哪些已经包含了您所需的部分内容。

一般的答案是否定的,因为您总是可以调用某种隐藏图灵机的存储过程。 事实上,你可以在SQL语句中做算术运算,我想这也会把你推到图灵悬崖上

当然,理论家总是告诉我们一切都是不可能的,所以我们都应该翻身死去

那你能做什么呢?一个“简单”的可能性是规范化SQL查询,就像简化代数方程一样。如果您能够以某种方式将一条SQL语句“规范化”(转换)为执行相同操作的绝对最短的等效SQL,那么您可以规范化两条SQL语句并比较结果语句;如果它们是相等的模标识符重命名,则它们具有相同的“语义”。对于SQL中的每个操作符,都有一些语义,以及一些等价的操作集,就像代数中一样。因此,如果您可以确定每个SQL操作符的代数等价集,那么您可以用做相同事情的最短代数等价物替换每个代数计算

要做到这一点,您必须能够解析SQL,并对解析后的SQL应用SQL重写,这意味着您需要。(您可以在中看到类似情况)

这并不是在所有情况下都有效。首先,可能有几个长度相同的“最短”SQL语句是等价的(2+XX+2相同,但对工具来说并不明显)。现在你有了一个定理证明问题(对于我们的X+2例子,使用交换定律证明它们相等),回到理论上。其次,您可能不知道如何使用重写生成尽可能短的序列;甚至数学方程式有时也要膨胀才能变小。从技术上讲,你必须搜索所有可能的代数等价物,以找到最短的,这是不可能的大


所以,在实践中也很难做到。所以,不。

这是图灵难题。实际答案是否定的。你的意思是解释计划在哪里是相同的?谢谢你的详细回答。我对你说的话做了更多的研究,确实有道理。