SQL 查询多个范围而不使用多个 OR 子句(嵌套 LIKE、BETWEEN)

标签 sql performance between

我通常必须为多个变量查询一个非常大的表,每个变量有很多条件。很多时候,一个变量需要查询多个范围。例如,我可能需要 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 通过嵌套 LIKEBETWEEN 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/

相关文章:

mysql - 如何在具有连接列的表达式之间使用

mysql - 按日期范围检索数据

sql - REPLACE INTO 查询是好的做法吗?

javascript - jQuery 效果运行流畅,但有时会变得不稳定 - 为什么?

Java Date - 插入数据库

performance - 查找具有给定 PR_SEARCH_KEY 的所有邮件

java - 杀死应用程序,在 Application 类的 onTrimMemory 方法中

mysql - 为什么字母的 BETWEEN 命令与 SQL 中的数字不同

mysql - 字符串中相邻字符的 SQL 正则表达式

MySQL连接到谷歌应用引擎实例