Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Аналог BETWEEN через <,>,=  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 675
Напомните пожалуйста чему идентичен запрос с BETWEEN если его переписать через использование <,>,=

SELECT *
FROM Universities
WHERE Students BETWEEN 10000 AND 30000


будет
1.
SELECT *
FROM Universities
WHERE Students > 10000 AND Students < 30000


или
2.
SELECT *
FROM Universities
WHERE Students >= 10000 AND Students <= 30000


???

источник http://2sql.ru/novosti/sql-between/
21 июл 19, 12:15    [21931153]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
court
Member

Откуда:
Сообщений: 1831
2
21 июл 19, 12:55    [21931160]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
Mr. X
Member

Откуда:
Сообщений: 10
Ольга Семенова,

Используйте правильные источники "BETWEEN returns TRUE if the value of test_expression is greater than or equal to the value of begin_expression and less than or equal to the value of end_expression."
21 июл 19, 15:51    [21931208]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 675
а что быстрее выполнится оптимизатором запросов ?
between или сочетание ">= и <= "
1 ноя 19, 08:53    [22007717]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19586
Это не разные операторы, а разные формы одного и того же оператора. Вопрос "что быстрее" не имеет смысла.
1 ноя 19, 09:25    [22007739]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3998
Давайте для пользы дела ответим на другой вопрос:

Допустим есть запрос в котором повторяются выражения

SELECT 
<Сложное выражение 1>, 
<Сложное выражение 2>
FROM XX
WHERE <Сложное выражение 1> >= <Сложное выражение 2> AND <Сложное выражение 1> >= 1 AND <Сложное выражение 2> <= 99999


Сделает ли оптимизатор запроса так, что эти выражение будут вычисляться один раз? И при каких условиях.

И ответ не совсем очевиден. Например, в выражении могут присутствовать deterministic и nondeterministic функции.
1 ноя 19, 09:37    [22007751]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
invm
Member

Откуда: Москва
Сообщений: 8839
a_voronin
Сделает ли оптимизатор запроса так, что эти выражение будут вычисляться один раз? И при каких условиях.
declare @t table (id int primary key, a float);

set statistics profile on;
select id, a from @t where power(a, 3) between 5 and 10 or power(a, 3) between 15 and 20;
select t.id, t.a from @t t cross apply (select power(t.a, 3)) x(a3) where x.a3 between 5 and 10 or x.a3 between 15 and 20;
with t as (select top (cast(0x7fffffffffffffff as bigint)) id, a, power(a, 3) as a3 from @t order by id) select id, a from t where a3 between 5 and 10 or a3 between 15 and 20;
set statistics profile off;
1 ноя 19, 11:20    [22007885]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3998
invm,

У вас какие-то навороченные примеры.

Если взять попроще, то вычисляет по три раза

set statistics profile on;
SELECT y, SIN(y) FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(0)) x(y)
WHERE SIN(y) > 0.1 AND SIN(y) < 0.9 
set statistics profile off;



SELECT y, SIN(y) FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(0)) x(y) WHERE SIN(y) > 0.1 AND SIN(y) < 0.9
|--Compute Scalar(DEFINE:([Expr1011]=sin(CONVERT_IMPLICIT(float(53),[Union1010],0))))
|--Filter(WHERE:(sin(CONVERT_IMPLICIT(float(53),[Union1010],0))>(1.0000000000000001e-001) AND sin(CONVERT_IMPLICIT(float(53),[Union1010],0))<(9.0000000000000002e-001)))
|--Constant Scan(VALUES1)),((2)),((3)),((4)),((5)),((6)),((7)),((8)),((9)),((0))))
1 ноя 19, 12:34    [22008010]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
invm
Member

Откуда: Москва
Сообщений: 8839
a_voronin
У вас какие-то навороченные примеры.
Мои примеры показывают, когда выражение вычисляется один раз, а когда нет.
1 ноя 19, 13:09    [22008054]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
L_argo
Member

Откуда:
Сообщений: 1006
Ольга Семенова
а что быстрее выполнится оптимизатором запросов ?
between или сочетание ">= и <= "
Думаю, что для оптимизатора это абсолютно одинаково. Чисто выбор удобства SQL конструкции для разработчика.
4 ноя 19, 12:05    [22009281]     Ответить | Цитировать Сообщить модератору
 Re: Аналог BETWEEN через <,>,=  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3998
L_argo,

если посмотреть на план, то нет -- не одинаково
5 ноя 19, 09:02    [22009708]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить