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

问题描述

| 我正在编写一些Java单元测试,并且需要比较两个sql字符串,其中sql语句在语义上是等效的,但是在语法上可以不同。我无法进行字符串比较,因为from子句和where子句的顺序可以不同,但​​是两个查询可能是等效的。 无论如何,在Java中无需编写我自己的Oracle SQL Parser就能做到这一点? :) 附言查询可能非常复杂! 谢谢 !     

解决方法

通常的答案是“否”,因为您总是可以调用某种隐藏了图灵机的存储过程。 我认为您可以在SQL语句中进行算术运算,这一事实也将您推向了图灵悬崖。 当然,理论家总是告诉我们一切都是不可能的,所以我们都应该翻身而死。 没事 所以,你可以做什么?好吧,“简单”的可能性是对SQL查询进行规范化,就像简化代数方程式一样。如果可以以某种方式将一个SQL语句“规范化”(转换)为执行同一操作的绝对最短等价的SQL,则可以将这两个SQL语句规范化并比较结果语句。如果它们等于模数标识符重命名,则它们具有相同的“语义”。对于SQL中的每个运算符,它背后都有一些语义,以及一些等效的操作集,就像在代数中一样。因此,如果您可以确定每个SQL运算符的代数等价集,则可以用做同样事情的最短代数等价项替换每个代数计算。 为此,您必须能够解析SQL,并将SQL重写应用于已解析的SQL,这意味着您需要一个程序转换引擎。 (您可以在“解析和重写代数”中看到类似的结果) 这并非在所有情况下都有效。首先,可能有几个等长的“最短” SQL语句是等效的(2 + X与X + 2相同,但对于工具而言并不明显)。现在,您已经有了一个定理证明问题(对于我们的X + 2示例,使用交换定律证明它们相等),回到了理论上。其次,您可能不知道如何使用重写来生成最短的序列。甚至数学方程有时也必须膨胀起来才能再次变小。从技术上讲,您必须搜索所有可能的代数对等物以找到最短的对等体,而这不可能太大。 因此,在实践中也很难做到。所以不行。     ,这不是直接解决问题的方法,但是您可能希望研究JSqlParser,它可能已经满足了您的部分需求。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...