gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:17:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com