2014-05-08 19 views
2

我有什麼似乎對我來說很愚蠢的問題。我有一個查詢,看起來像:子句之間 - 我必須重新排序參數嗎?

SELECT id FROM myTable WHERE valueCol BETWEEN :x and :y; 

這個偉大的工程時:x <= :y但是,當:x > :y它不會返回我要行!對於這種情況,我必須手動反轉變量才能使其正常工作。

有沒有辦法寫一個變量的順序無關緊要的子句?

PS>我包括SQL,因爲我非常確定這只是一個普通的sql問題。

+1

[由甲骨文公司在線發佈的精美手冊,任何人都可以免費獲得谷歌搜索的成本](http:///docs.oracle.com/cd/B28359_01/server.111/b28286/conditions011.htm#SQLRF52147)表示x必須實際上由<= y。 –

+0

至於你的PS:這很好,你把它標記爲「sql」 - 不管這是否是一個普通的SQL問題。你的問題涉及Oracle SQL(而不是Oracle中的分區策略,最佳服務器設置或其他),因此標記這個「oracle」加上「sql」是完美的。 –

回答

9

是的,這很簡單:

SELECT id 
FROM myTable 
WHERE valueCol BETWEEN LEAST(:x,:y) and GREATEST(:x,:y); 
0

你可以使用一個案例:

between case when :x <= :y then :x else :y end 
and case when :x <= :y then :y else :x end 
4

你可以做的檢查自己和交換價值,或者,你可以做這樣的事情,讓甲骨文想一想:

BETWEEN LEAST(:x,:y) AND GREATEST(:x,:y) 
+0

對不起,後續 - 我不得不懷疑:是否有任何性能分歧爲甲骨文做這項工作? –

+1

簡單的答案是 - 是和否。是的,無疑需要幾個CPU週期來執行最少和最大的數據,但不會,你不會注意到它。分享並享受。 –

+1

@drew_w:進行實際比較還有一點額外的工作量。更大的問題是,這是否會影響優化器選擇不使用索引範圍掃描操作來滿足'valueCol'上的謂詞。 (我知道當Oracle開發一個執行計劃時,Oracle可以做一些「綁定變量窺視」來獲得基數的估計值(理想情況下,Oracle會評估LEAST和GREATEST表達式,並將結果用於制定執行計劃,所以在那裏沒有什麼區別,但我不知道是否。) – spencer7593

相關問題