在函数中打开SQL语句

时间:2018-11-08 16:36:50

标签: sql oracle

如何在Oracle SQL中用变量替换具体值?我有

 select 5, min(id) from my_table where id > 5 --AND ..
 UNION ALL     
 select 6, min(id) from my_table where id > 6  --AND ..
 UNION ALL
 ....  

 | 5 | 6 |
 | 6 | 8 |
 ...

如何将其包装在下面执行伪代码的函数中?

for ( $i in ( select id from my_table)){
    UNION ALL
    select $i, min(id) from my_table where id > $i 
}

编辑:为了清楚起见,我正在寻找一种通用方法,将具有硬连线值的选择转换为接受变量的函数。请注意--AND部分。


Edit2:
让我用Java翻译它。 问题:我有代码

  System.out.println(1+2+" = 1+2"+ " ");

返回两个数字的和。如何用任何ab替换具体的1 + 2?
答:
您需要定义

   int getSum(int a, int b){ return a+b;}  

现在您可以写

for(int a : setA){    
    for(int b : setB){    
        System.out.println(" " +a+"+"+b+" = "+ getSum(a,b)+" ");    
        }}   

这样,您可以遍历setA的所有元素和setB的所有元素,而不必提供具体的值1和2。

我对SQL有完全相同的问题。如果我有一个查询返回一个具体值的结果的查询(Java示例:12; SQL示例:where id > 6)-如何对其进行修改,以使SQL遍历所有可能的值值(通过从按ID分组的t中选择id获得)?

1 个答案:

答案 0 :(得分:1)

您似乎想为每个ID获取下一个ID。只需使用lead函数即可完成:

select
  t.id,
  lead(t.id) over (order by t.id) as next_id
from
  my_table t

如果您确实想从函数中返回它,则可能需要一个返回自定义表类型的表函数,因为要返回的行类型与您的表结构不匹配,因此您不能使用{{1} }。

下面的代码段将创建这样的行类型和匹配的表类型,并返回与上面的查询相同的函数。最后几行包含相同的查询,现在使用函数而不是表:

my_table%rowtype

有关表函数的更多信息,我认为本教程/文章是一个好的开始:

http://stevenfeuersteinonplsql.blogspot.com/2015/04/table-functions-introduction-and.html