2012-08-09 103 views
1

在Oracle中评估多个范围我有一个Oracle选择,看起来像这样:IN子句

SELECT * 
    FROM CUSTOMER 
WHERE (CUSTOMER_TYPE BETWEEN 100 AND 200 
    OR CUSTOMER_TYPE = 350 
    OR CUSTOMER_TYPE BETWEEN 410 AND 520); 

我想改变它的东西,它结合了相同的语句中的多个范围和个人价值的评价。下面的语法是不正确的,但有一些Oracle等价物吗?

SELECT * 
    FROM CUSTOMER 
WHERE CUSTOMER_TYPE IN (100..200, 350, 410..520); 
+0

你为什么要这样做?你想在这里获得什么? – Victor 2012-08-09 19:59:36

+0

嗯...据我所知,你已经在做这个最佳。你为什么要改变? – Ben 2012-08-09 20:35:47

回答

0

考虑这是一种可能性。

SELECT * 
FROM CUSTOMER c, 
(
    select level + 99 n from dual connect by level < 102 
     union all 
    select 350 n from dual 
     union all 
    select level + 409 n from dual connect by level < 112 
) t 
WHERE c.CUSTOMER_TYPE = t.n 

它避免了ORIN。如果你幸运的话,散列连接就是结果。

+1

这是一个同样准确的方法,但我没有看到好处。你仍然在进行相同的索引范围扫描(假设它已被索引),但是你在SQL中而不是在内部生成范围,这会慢一些。 – Ben 2012-08-09 21:05:57

+0

我试图避免BETWEEN,因为如果我正在评估非连续的数字范围,它需要多个OR语句。我只想知道是否有更简单的'短手'来评估一系列数字。其他语言允许“100..200”作为“100到200”之间的短手。我的实际查询比许多BETWEEN/OR语句大得多。剂量Oracle对BETWEEN – 2012-08-09 21:17:20

+1

@GreggFeldt具有等同的缩写,无论你做什么,无论你做什么,都需要来自多个范围的数据。这反过来意味着你必须使用逻辑OR。不管你用什么语言,它仍然是一样的。为什么语法很重要?你当前的查询效率不够高吗? – Ben 2012-08-09 21:21:22