gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:06:23 25 4
gpt4 key购买 nike

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

有没有办法在java中做到这一点而不必编写我自己的Oracle SQL Parser? :)

附言查询可能非常复杂!

谢谢 !

最佳答案

一般的答案是否定的,因为您总是可以调用某种隐藏图灵机的存储过程。
我认为您可以在 SQL 语句中进行算术这一事实也将您推向了图灵悬崖。

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

不。

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

为此,您必须能够解析 SQL,并将 SQL 重写应用于解析的 SQL,这意味着您需要一个 program transformation engine . (您可以在 Parsing and Rewriting Algebra 看到类似的内容)

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

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

关于sql - 有什么办法可以比较两个 sql 字符串来检查它们在语义上是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com