2011-09-02 54 views
3

我需要替换变量进行排序,以便我可以稍后再引用它们是这样的:甲骨文排序替代变量

WITH 
vars AS (SELECT SORT(:var1,:var2, :var3) FROM DUAL) 
SELECT least_var, greater_var, greatest_var FROM vars; 

回答

2

既然你有替代变量,你显然有一些宿主语言。因此,一种方法是在调用SQL查询之前以主机语言排序这三个值。

另一种方法是使用下面的查询(例如与WITH子句组合):

select 
    least(:var1, :var2, :var3) as least_var, 
    case 
     when :var2 < :var1 and :var1 < :var3 
     or :var2 > :var1 and :var1 > :var3 then :var1 
     when :var1 < :var2 and :var2 < :var3 
     or :var1 > :var2 and :var2 > :var3 then :var2 
     else :var3 
    end as greater_var, 
    greatest(:var1, :var2, :var3) as greatest_var 
from dual 

创建一种功能,你建议将没有真正的工作作为一个函数无法返回,供应结构为三列。如果你想使用函数,那么使用它们中的三个:内置函数LEAST和GREATEST以及用户定义的函数GREATER。

+0

当然,您可以创建返回3列结果集的函数。但是你会像使用表一样使用:'select * from sort(:var1,:var2,:var3)' –

+0

@Codo,谢谢。我猜SQL解决方案无论如何都是相当丑陋的,但在主机语言中排序有一个缺点:如果其他人使用我的查询(这只是一个更大的查询中的一个片段)忘记对变量进行排序,他们会得到错误的结果。 – jFrenetic