使用decode-to-use case轻松移植SQLs

使用decode-to-use case轻松移植SQLs,sql,oracle,porting,Sql,Oracle,Porting,我有数百个包含SQL的文件,它们使用Oracle的内置函数decode。我想将它们移植到使用case时使用。是否有一个程序或一组程序可以自动执行此操作?我不记得有任何程序会将解码语句移植到案例中。 你为什么要这么做,除非你必须这么做。 Decode更为复杂,即使在条件数量增加时也能提供可读的代码。我不记得有什么东西能将Decode语句移植到案例中。 你为什么要这么做,除非你必须这么做。 解码要复杂得多,即使在条件数量增加时也能提供可读的代码。我认为没有这样完整的解决方案。你必须为这项任务做一些(

我有数百个包含SQL的文件,它们使用Oracle的内置函数
decode
。我想将它们移植到使用
case时使用
。是否有一个程序或一组程序可以自动执行此操作?

我不记得有任何程序会将解码语句移植到案例中。 你为什么要这么做,除非你必须这么做。
Decode更为复杂,即使在条件数量增加时也能提供可读的代码。

我不记得有什么东西能将Decode语句移植到案例中。 你为什么要这么做,除非你必须这么做。
解码要复杂得多,即使在条件数量增加时也能提供可读的代码。

我认为没有这样完整的解决方案。你必须为这项任务做一些(大的)工作。您应该进行一些解析,选择其中一种方法

  • 使用完整的Oracle SQL解析器并以自己的方式处理AST,然后将修补的AST刷新到文件中(例如,尝试在此处查找解析器)
  • 编写足够的解析器(我指的是Oracle SQL语言的一个较小子集)来处理解码(我想这很难,因为解码可能出现在语法的许多地方\级别,并且您必须实现很多)。这里为您提供的工具有lex+yacc、ANTLR等

  • 我认为没有这样完整的解决办法。你必须为这项任务做一些(大的)工作。您应该进行一些解析,选择其中一种方法

  • 使用完整的Oracle SQL解析器并以自己的方式处理AST,然后将修补的AST刷新到文件中(例如,尝试在此处查找解析器)
  • 编写足够的解析器(我指的是Oracle SQL语言的一个较小子集)来处理解码(我想这很难,因为解码可能出现在语法的许多地方\级别,并且您必须实现很多)。这里为您提供的工具有lex+yacc、ANTLR等

  • 我不敢苟同<代码>案例。。当更加复杂时。当某些列如“Foo%”时,如何将
    情况转换为解码语句?当id=42时,将另一列*12;当purchase\u date=trunc(当前日期)时,将另一列*42;当0 end
    时,如何将其转换为解码语句。例如,decode(某些列,'foo%',其他列*12,0)decode(某些列,'12',其他+7,0)同意,decode一次只解码一列,但从编程的角度来看,它看起来更可读,而不是在一种情况下插入所有这些条件。其他语言也是如此,比如C/C++,与其在单个if(,,,)块中指定多个条件,不如使用嵌套if-else。如何在解码语句中使用
    like
    ?还是
    ?或介于之间的
    ?或者像
    那样的regexp\u?那么你就不能概括所有的东西。有一点我同意,这取决于要求——时间和解码都有其优点和缺点。你说的“解码要复杂得多”,这根本不是真的。我不同意<代码>案例。。当更加复杂时。当某些列如“Foo%”时,如何将
    情况转换为解码语句?当id=42时,将另一列*12;当purchase\u date=trunc(当前日期)时,将另一列*42;当0 end
    时,如何将其转换为解码语句。例如,decode(某些列,'foo%',其他列*12,0)decode(某些列,'12',其他+7,0)同意,decode一次只解码一列,但从编程的角度来看,它看起来更可读,而不是在一种情况下插入所有这些条件。其他语言也是如此,比如C/C++,与其在单个if(,,,)块中指定多个条件,不如使用嵌套if-else。如何在解码语句中使用
    like
    ?还是
    ?或介于之间的
    ?或者像
    那样的regexp\u?那么你就不能概括所有的东西。有一点我同意,这取决于需求情况——时间和解码都有各自的优点和缺点。你说的“解码要复杂得多”,这根本不是真的。