Интервальный предикат
Функция
Определение сравнения вида «условие-диапазон».
Спецификация
::=
::=
::=
::=
Синтаксические правила
-
Типы всех
< значимых выражений >
должны быть совместимыми.Salary*(Age -30) BETWEEN 0 AND 52*3500*10
-
Для значений типов
CHAR
иVARCHAR
проверяется совпадение кодировок, при несовпадении преобразование типов не выполняется. -
< Интервальный запрос >
не должен возвращать множественное значение.select "Наименование",count(*) from "Наличие" where "Цена" BETWEEN select min(sum) from "Прейскурант" and select avg(sum) 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
.