T-SQL BETWEEN问题最大值首先

Has*_*anG 1 t-sql sql-server sql-server-2008

为什么这两个表达式返回不同的结果 这真是太愚蠢了.

SELECT * FROM Table WHERE ID BETWEEN 3 AND 1

SELECT * FROM Table WHERE ID BETWEEN 1 AND 3
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 12

正如文件所说:

如果test_expression的值大于或等于begin_expression的值且小于或等于end_expression的值,则BETWEEN返回TRUE.

关于交换start_expression和end_expression以匹配最小值和最大值没有说什么.您应该期望记录结果,而不是您认为的结果.

对于奇怪的是,ANSI SQL99标准指定BETWEEN谓词应该包含SYMMETRIC或ASYMMETRIC比较的子句.只允许SYMMETRIC交换start_range和end_range,ASYMMETRIC要求严格.ASYMMETRIC表单是隐式表单.换句话说,如OP建议的那样,解释A BETWEEN X and Y(A>=X AND A<=Y) OR (A>=Y AND A<=X)不符合标准的实现.

  • @HasanGürsoyMySQL是MySQL,而不是SQL Server.虽然看看SQL规范关于BETWEEN的内容会有点有趣,但是需要满足不同的数据库,因为它们可能在规范的"解释"和/或可能只做自己的事情上有很大分歧--MySQL引用和SQL Server中的NULL唯一约束会浮现在脑海中.因此,需要查阅相应的*实现*文档. (3认同)

Mar*_*ith 8

ID BETWEEN 3 AND 1只是简单的手,ID >= 3 AND ID <=1所以永远不会返回任何结果.

如果你看一下查询计划,你会看到,查询文本实际被扩张到这个(编辑或者至少你可以看到这种替代的BETWEEN>=/ <=在获得汽车parametrised查询)