2012-10-22 29 views
3

我有一個需求,其中有四個參數。 P1,P2,P3,P4。用戶可以輸入其中任何一種或者單個或者組合。我想只顯示他通過求和和分組輸入的列。其他列應該被排除。我怎樣才能做到這一點?在Oracle中動態求和和組合

+1

用戶通過應用程序輸入數據(網絡,桌面,命令行,無所謂)。你應該在應用程序中動態構建你的查詢,這根本不是一個PLSQL問題... –

+0

你的問題並不清楚,你的意思是*總結和分組* *?你需要做一些旋轉嗎? –

+0

我想知道如何建立查詢..因爲他可以輸入24個組合。例如,如果他輸入p1,p2我只需要通過p1,p2從表組中選擇p1,p2來顯示p1,p2。 ,p3他可以輸入.p1,p2,p3,p4 als0.Jus -1.Hop我明確地解釋了我的需求 –

回答

1

像這樣的事情可能對你工作(我不是100%肯定,因爲你的問題很模糊)

SELECT 
    CASE WHEN :p1 = 0 THEN p1 ELSE NULL END AS p1, 
    CASE WHEN :p2 = 0 THEN p2 ELSE NULL END AS p2, 
    CASE WHEN :p3 = 0 THEN p3 ELSE NULL END AS p3, 
    CASE WHEN :p4 = 0 THEN p4 ELSE NULL END AS p4 
FROM 
    yourTable 
GROUP BY 
    CASE WHEN :p1 = 0 THEN p1 ELSE NULL END, 
    CASE WHEN :p2 = 0 THEN p2 ELSE NULL END, 
    CASE WHEN :p3 = 0 THEN p3 ELSE NULL END, 
    CASE WHEN :p4 = 0 THEN p4 ELSE NULL END 

注意,但是,SQL經常使用這種類型的表現相當糟糕的查詢。

對於每個固定的查詢,編譯一個單獨的計劃。用於生成結果的算法在該點固定。當你的參數改變時它不會被重新編譯。

這很重要,因爲根據您的索引,GROUP BY p1, p2可能會導致與使用GROUP BY p3, p4有根本不同的計劃。

因此,在代碼中重新生成SQL語句通常會更加高效。

與其讓SQL使用參數選擇哪些字段被聚合,不如使用參數來編寫全新的SQL語句,而是執行新的SQL語句。

0

這個問題可以通過使用動態SQL來解決。在動態SQL中,您可以首先基於輸入參數構造您的select語句,然後使用例如執行立即。請閱讀有關如何使用動態SQL的oracle documentation