我通常必须为多个变量查询一个非常大的表,每个变量有很多条件。很多时候,一个变量需要查询多个范围。例如,我可能需要 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
s 通过嵌套 LIKE
或 BETWEEN
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 来说仍然很新。
最佳答案
一些评论否认 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' )
(运算符“=”可以替换为任何其他比较运算符,例如“<=”)
关于SQL 查询多个范围而不使用多个 OR 子句(嵌套 LIKE、BETWEEN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10834194/