T-SQL МЕЖДУ проблемой максимальное значение первым - PullRequest
1 голос
/ 22 августа 2011

Почему эти два выражения возвращают разные результаты?Это действительно глупо.

SELECT * FROM Table WHERE ID BETWEEN 3 AND 1

SELECT * FROM Table WHERE ID BETWEEN 1 AND 3

Ответы [ 2 ]

12 голосов
/ 22 августа 2011

Как указано в документации :

BETWEEN возвращает TRUE, если значение test_expression больше или равно значению begin_expression и меньше или равно значениюend_expression.

Ничего не говорит о замене выражений start_expression и end_expression для соответствия минимальным и максимальным значениям.Вы должны ожидать, что результат задокументирован, а не так, как вы считаете.

Для любопытных, стандарт ANSI SQL99 указывает, что предикат BETWEEN должен включать условие сравнения SYMMETRIC или ASYMMETRIC.Только SYMMETRIC допускается менять местами start_range и end_range, ASYMMETRIC должен быть строгим.АСИММЕТРИЧЕСКАЯ форма является неявной формой.Другими словами, реализация, которая интерпретирует A BETWEEN X and Y как (A>=X AND A<=Y) OR (A>=Y AND A<=X), как предполагает OP, не соответствует стандарту.

8 голосов
/ 22 августа 2011

ID BETWEEN 3 AND 1 - это просто сокращение для ID >= 3 AND ID <=1, поэтому никогда не вернет никаких результатов.

Если вы посмотрите на план запроса, то увидите, что текст запроса фактически расширился до этого ( Редактировать Или, по крайней мере, вы можете увидеть эту замену BETWEEN на >= / <= в запросах, которые автоматически параметризуются)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...