7

我通常必须在一个非常大的表中查询多个变量,每个变量有很多条件。很多时候,一个变量需要查询多个范围。例如,我可能需要 VAR_1 的所有记录,其中 VAR_1 介于 200-300、350-400、450-500 之间。

通常我会这样写,但有人告诉我使用IN()而不是多个 OR 会更有效。

SELECT * FROM table
WHERE VAR_1 BETWEEN '200' AND '300' OR
      VAR_1 BETWEEN '350' AND '400' OR
      VAR_1 BETWEEN '450' AND '500'

OR有什么方法可以压缩这些信息并通过在 中嵌套LIKEorBETWEEN子句来摆脱s IN()?类似于以下内容:

WHERE VAR_1 IN (BETWEEN '200' AND '300', BETWEEN '350' AND '400', BETWEEN '450' AND '500')

或者

WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')

我已经尝试过这样的事情,但语法显然不正确。您可以指出我的任何想法或方向都会很棒,但对于 SQL 来说还是很新的。

4

1 回答 1

4

一些评论否认 IN 子句比使用 OR 更有效——我认为这对于一般情况是不正确的。

它仅取决于数据库的查询优化器。

如果查询优化器足够聪明,它会将 OR 和 IN 子句转换为相同的执行计划(如果它们在语义上相等)。在这种情况下,两个计划的进一步计划处理将具有相同的成本,一个小的差异可能是转换的成本可能会产生小的差异。

另一方面,查询优化器可能不会注意到 OR 谓词的强相关性并在执行计划中独立评估每个范围谓词(每个谓词都是单独的运算符),而 IN 子句可能由所有的查找表处理in 子句中的值(只有一个运算符)导致明显的运行时差异。

所以总体答案是它在很大程度上取决于您的 DBMS,我建议您在系统上的小型基准设置中尝试这两个版本。

对于 SQL-92,没有类似的特殊语法

WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')

所以确实你只有 OR 或 IN 列表。

请注意,更一般的表示法

WHERE VAR_1 IN ( '200', '201' )

WHERE VAR_1 = ANY ('200','201' )

(运算符“=”可以替换为任何其他比较运算符,例如“<=”)

于 2012-10-23T12:10:13.050 回答