为什么这两个表达式返回不同的结果?这真是太愚蠢了。
SELECT * FROM Table WHERE ID BETWEEN 3 AND 1
SELECT * FROM Table WHERE ID BETWEEN 1 AND 3
答案 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}在获得自动参数化的查询中的/ >=