我正在尝试使查询比我现在的更有效。有一列我想要使用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.}
由于
答案 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}