作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通常必须为多个变量查询一个非常大的表,每个变量有很多条件。很多时候,一个变量需要查询多个范围。例如,我可能需要 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]')
最佳答案
一些评论否认 IN 子句可能比使用 OR 更有效——我认为这对于一般情况是不正确的。
它仅取决于数据库的查询优化器。
如果查询优化器足够聪明,它会将 OR 和 IN 子句转换为相同的执行计划(如果它们在语义上相等)。
在这种情况下,两个计划的进一步计划处理将具有相同的成本,一个小的差异可能是转换成本可能会产生小的差异。
另一方面,查询优化器可能不会注意到 OR 谓词的强相关性,并在执行计划中独立评估每个范围谓词(每个范围谓词都是一个单独的运算符),而 IN 子句可能由所有的查找表处理。 in 子句中的值(只有一个运算符)导致明显的运行时差异。
所以总体答案是它在很大程度上取决于您的 DBMS,我建议您在系统的小型基准设置中试用这两个版本。
对于 SQL-92,没有类似的特殊语法
WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')
WHERE VAR_1 IN ( '200', '201' )
WHERE VAR_1 = ANY ('200','201' )
关于SQL 查询多个范围而不使用多个 OR 子句(嵌套 LIKE、BETWEEN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10834194/
我是一名优秀的程序员,十分优秀!