Интервальный предикат
Функция
Определение сравнения вида «условие-диапазон».
Спецификация
::=
::=
::=
::=
Синтаксические правила
-
Типы всех
<значимых выражений>
должны быть совместимыми.Salary*(Age -30) BETWEEN 0 AND 52*3500*10
-
Для значений типов
CHAR
иVARCHAR
проверяется совпадение кодировок, при несовпадении преобразование типов не выполняется. -
<Интервальный запрос>
не должен возвращать множественное значение.select "Наименование" from "Наличие" where "Цена" BETWEEN (select min(sum1) from "Прейскурант") AND (select avg(sum1) from "Прейскурант"); create or replace table tst(i int, c char(5)); insert into tst (values (1, '11111'); insert into tst (values (2, '22222'); insert into tst (values (3, '33333'); insert into tst (values (4, '44444'); insert into tst (values (5, '55555'); select count(*) from tst where i between (values(2)) and (values(4)); | 3|
create or replace table tst1(i int); insert into tst1 (values (2); insert into tst1 (values (4); select count(*) from tst where i between (table tst1 where rowid=1) and (table tst1 where rowid=2); | 3|
-
Выражение:
<значимое выражение> BETWEEN <нижняя граница> AND <верхняя граница> эквивалентно: <значимое выражение> >= <нижняя граница> AND <значимое выражение> <= <верхняя граница>
Эквивалентные конструкции:
select count(*) from auto where cylnders between 10 and 12; select count(*) from auto where cylnders>=10 and cylnders<=12;
-
Выражение:
<значимое выражение> NOT BETWEEN <нижняя граница> AND <верхняя граница> эквивалентно: NOT (<значимое выражение > BETWEEN <нижняя граница> AND <верхняя граница>)
Эквивалентные конструкции:
select count(*) from auto where cylnders not between 10 and 12; select count(*) from auto where not cylnders between 10 and 12;
-
Опция
SYMMETRIC
задаёт свойство симметричности интервальных границ, то есть значение <интервального предиката> не должно зависеть от порядка задания границ интервала, например:значение предиката будет истинным в обоих случаях:
! between symmetric 1 and 3 ! between symmetric 3 and 1 create or replace table test( i1 int, i2 int, i3 int ); insert into test values ( 1, 2, 3 ); insert into test values ( 2, 3, 1 ); insert into test values ( 3, 1, 2 ); insert into test values ( 1, 3, 0 ); select * from test where i1 between symmetric 4 and 2; I1 I2 I3 -- -- -- | 2| 3| 1| | 3| 1| 2|
select * from test where i1 < 2 and i1 between symmetric i2 and i3; I1 I2 I3 -- -- -- | 1| 3| 0|
-
Опция
ASYMMETRIC
задаёт свойство асимметричности интервальных границ, то есть значение<интервального предиката>
зависит от порядка задания границ интервала, например:значение предиката
between asymmetric 1 and 3
– истинно,а предиката
between asymmetric 3 and 1
– ложноselect count(*) from auto where 2 between asymmetric 1 and 3; | 1000|
select count(*) from auto where 2 between asymmetric 3 and 1; | 0|
select count(*) from auto where 2 between symmetric 3 and 1; | 1000|
-
По умолчанию (если опции симметричности не заданы) используется
ASYMMETRIC
.