查询的有效方式而不是多个OR

时间:2014-05-27 18:19:27

标签: sql oracle10g

我正在尝试使查询比我现在的更有效。有一列我想要使用16个不同的值,它还有更多。而不是使用column = value1 OR column = value2等,一直到16,有没有更好的方法呢?

下面是我正在使用的一个例子,以及我正在尝试做的事情。

SELECT *
FROM TABLE_A A
WHERE A.COLUMN1 = VALUE1
OR A.COLUMN1 = VALUE2
OR A.COLUMN1 = VALUE5
OR A.COLUMN1 = VALUE7
etc..

我更喜欢做的事情是这样的:

SELECT *
FROM TABLE_A A
WHERE A.COLUMN1 = {VALUE1, VALUE2, VALUE5, VALUE7, etc.}

由于

2 个答案:

答案 0 :(得分:3)

您可以使用an IN condition

SELECT *
FROM TABLE_A A
WHERE A.COLUMN1 IN (VALUE1, VALUE2, VALUE5, VALUE7);

它在操作中效率不高,因为它将被数据库引擎转换回OR语句,但它的编写和维护效率可能更高。

你在列表中也有1000个项目的限制,但是如果你接近那个(显然你不是,只有16个),那么另一种方法通常会更好。

你应该考虑你的16个值来自哪里;如果他们最终来自另一个表,那么你应该重做这个来做一个连接,或者可能是一个子查询。


这些不等同于:

<something> AND M.PRODUCT_CODE IN ('A','J')

<something> AND M.PRODUCT_CODE = 'A' OR M.PRODUCT_CODE = 'J'

第二个将被评为:

(<something> AND M.PRODUCT_CODE = 'A') OR M.PRODUCT_CODE = 'J'

因此,即使其他条件不是净值,您也可以从PRODUCT_CODE = 'J'的任何行获得结果。 Logic condition precedence很重要:

  

Oracle在表达式中从左到右评估具有相同优先级的条件,但以下情况除外:

     
      
  • 对于使用AND连接的多个条件,无法保证从左到右的评估。

  •   
  • 对于使用OR连接的多个条件,无法保证从左到右的评估。

  •   

你应该使用括号来避免歧义 - 即使它正在做你想要的事情,明确地使用它们会使你的意图变得清晰,并且可以更容易地修改代码,而不会产生令人讨厌的副作用。

答案 1 :(得分:-1)

SELECT *
FROM TABLE_A A
WHERE A.COLUMN1 IN {VALUE1, VALUE2, VALUE5, VALUE7}