2011-09-02 55 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