T-SQL BETWEEN问题最大值首先

时间:2011-08-21 22:03:17

标签: sql-server tsql sql-server-2008

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

SELECT * FROM Table WHERE ID BETWEEN 3 AND 1

SELECT * FROM Table WHERE ID BETWEEN 1 AND 3

2 个答案:

答案 0 :(得分:12)

正如documentation所说:

  

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

没有说明交换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)的实现不符合标准。

答案 1 :(得分:8)

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

如果您查看查询计划,您会看到查询文本实际扩展到此(修改>或者至少您可以看到BETWEEN替换为{{1}在获得自动参数化的查询中的/ >=