用SQL构造递归比较

用SQL构造递归比较,sql,oracle,validation,loops,Sql,Oracle,Validation,Loops,这是一个丑陋的。我希望我不必问这个问题,但是这个项目已经构建好,这样我们就可以处理数据库中的大量验证。本质上,我正在尝试构建一个函数,它将获取两个数据堆栈,将它们与未知的一批操作或比较器组合在一起,并生成一个长字符串 是的,这是非常糟糕的措辞,所以我要举一个例子。我有一个表单,它本身可以有多个迭代。出于某种原因,系统希望知道在这些表单中输入的开始日期是否等于在这些表单中输入的结束日期。不幸的是,由于系统的设计方式,所有内容都存储为字符串,因此我必须先将其格式化为日期,然后才能进行比较。下面是伪代

这是一个丑陋的。我希望我不必问这个问题,但是这个项目已经构建好,这样我们就可以处理数据库中的大量验证。本质上,我正在尝试构建一个函数,它将获取两个数据堆栈,将它们与未知的一批操作或比较器组合在一起,并生成一个长字符串

是的,这是非常糟糕的措辞,所以我要举一个例子。我有一个表单,它本身可以有多个迭代。出于某种原因,系统希望知道在这些表单中输入的开始日期是否等于在这些表单中输入的结束日期。不幸的是,由于系统的设计方式,所有内容都存储为字符串,因此我必须先将其格式化为日期,然后才能进行比较。下面是伪代码,所以请不要纠正我的语法

输入数据:

现在,正如我所提到的,这种形式有多个迭代,我需要循环构建一个完全递归的比较注释:它可能并不总是典型的布尔比较,它也可以在内部调用函数,所以。In或类似的任何东西都不起作用。最后,我需要将其转换为如下格式,以便验证解析器能够读取它

OR(to_date(formname.control1name.1) == to_date(formname.control2name.1)
   ,to_date(formname.control1name.2) == to_date(formname.control2name.1)
   ,to_date(formname.control1name.3) == to_date(formname.control2name.1)
   ,to_date(formname.control1name.1) == to_date(formname.control2name.2)
   :
   :
   ,to_date(formname.control1name.n) == to_date(formname.control2name.n))
是的,这很难看…但是考虑到我们的验证解析器的工作方式,我没有太多的选择。对如何实现这一点有何意见?我希望有比双递归循环更有效的方法,但除此之外,我没有其他想法

好的,鉴于我的问题显然非常不清楚,我将补充一些信息。我不知道我将对这些项执行什么样的比较,我只是尝试将数据重新格式化为可用于任何给定函数的内容。如果我在数据库之外做这件事,它看起来会像这样。注意:伪代码。是VAL1函数中的位置标记,“^”是VAL2的位置标记

function dynamicRecursiveValidation(string functionStr, strArray vals1, strArray vals2){
  string finalFunction = "OR("
  foreach(i in vals1){
    foreach(j in vals2){
      finalFunction += functionStr.replace('#', i).replace('^', j) + ",";
    }
  }
  finalFunction.substring(0, finalFunction.length - 1); //to remove last comma
  finalFunction += ")";

  return finalFunction;
}
这就是我想要完成的一切。取任意给定的比较器和两个数组,创建一个包含所有可能组合的字符串。鉴于上面列出的替换字符,下面列出了可能添加的操作

# > ^
to_date(#) == to_date(^)
someFunction(#, ^)
# * 2 - 3 <= ^ / 4

我所要做的就是生成我稍后将执行的字符串,并且我正在尝试这样做,而不必在递归循环中杀死服务器

我没有解决方案代码,但您可以通过算法执行以下操作

创建临时表start_date、end_date和formid,并使用任何现有表单中的每个日期填充它 从表格中获取开始日期,只需:

从临时表格中选择结束日期,表格id,其中结束日期=

相反

从临时表格中选择开始日期,表格id,其中开始日期=


如果数据库可用,为什么不让它完成所有繁重的工作。

我最终执行了数据的叉积,并循环了结果。这不是我真正想要的那种解决方案,但它起了作用。

您将得到什么输入?你期待什么样的解决方案?除了我们对你的困境表示同情之外,你还想从我们这里得到什么?我正在寻找一种方法,可以递归地在混乱中循环,而不必编写双循环。如果我坚持使用双循环,那么好吧……但我想尝试另一种方法从“输入”生成“结果”。@guildsbounty那么你想比较Oracle函数中的两个字符串日期列表吗?@guildsbounty-我知道你认为你在解释自己,但你真的没有。你的评论只是改写了你原来的问题:我们需要的是细节,那是额外的信息。问题是……我没有更多的信息。我所知道的是,我将得到两个数组,以及一个需要对它们执行的操作,我必须编写一个函数来同时处理所有这些。我给出了一个单独的例子,但也可能是比较字符串执行此函数,看看它是否返回true,并且必须针对数组中的每个项运行它。我不是在尝试运行比较,我是在尝试重新格式化…我将编辑这个问题,以显示如果我可以在DB之外工作,我将如何处理它的伪代码
# > ^
to_date(#) == to_date(^)
someFunction(#, ^)
# * 2 - 3 <= ^ / 4