2014-05-08 17 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

相关问题