Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在不使用多个OR子句的情况下查询多个范围(嵌套式、中间式)_Sql_Performance_Between - Fatal编程技术网

SQL在不使用多个OR子句的情况下查询多个范围(嵌套式、中间式)

SQL在不使用多个OR子句的情况下查询多个范围(嵌套式、中间式),sql,performance,between,Sql,Performance,Between,我通常需要查询一个非常大的表,其中包含多个变量,每个变量有许多条件。通常,一个变量需要查询多个范围。例如,我可能需要VAR_1的所有记录,其中VAR_1在200-300350-400450-500之间 通常我会这样写,但有人告诉我,在()中使用IN而不是使用多个OR会更有效。 有没有办法通过在IN()中的子句之间嵌套LIKE或来压缩此信息并去掉或呢? 大致如下: 其中VAR_1 IN(在'200'和'300'之间、在'350'和'400'之间、在'450'和'500'之间) 或 其中变量1位

我通常需要查询一个非常大的表,其中包含多个变量,每个变量有许多条件。通常,一个变量需要查询多个范围。例如,我可能需要VAR_1的所有记录,其中VAR_1在200-300350-400450-500之间

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

有没有办法通过在
IN()中的
子句之间嵌套
LIKE
来压缩此信息并去掉
呢?
大致如下:

其中VAR_1 IN(在'200'和'300'之间、在'350'和'400'之间、在'450'和'500'之间)

其中变量1位于(“[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]')
事实上,你只有或的或在列表中

请注意,对于

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


(运算符“=”可以替换为任何其他比较运算符,例如“我应该如何放置它?否:)好吧,你们可以制作一个包含不同范围的表格,并在上面进行连接?使用IN实际上是通往多个OR子句的捷径。它的效率不比使用OR高也不比使用OR低。为什么你们要引用看起来像数字的东西?在需要整数的时候进行字符串比较是经常出现问题的原因。质疑你们的假设:为什么这会更有效吗?(回答:不会)@PhilSandler很高兴知道,谢谢。
WHERE VAR_1 IN ( '200', '201' )
WHERE VAR_1 = ANY ('200','201' )