Интервальный предикат

Функция

Определение сравнения вида «условие-диапазон».

Спецификация
 
<​интервальный предикат​>::=
Синтаксические правила
  1. Типы всех <​значимых выражений​> должны быть совместимыми.

    Salary*(Age -30) BETWEEN 0 AND 52*3500*10
  2. Для значений типов CHAR и VARCHAR проверяется совпадение кодировок, при несовпадении преобразование типов не выполняется.

  3. <​Интервальный запрос​> не должен возвращать множественное значение.

    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|
  4. Выражение:

    <​значимое выражение​> BETWEEN <​нижняя граница​> AND <​верхняя граница​>
    эквивалентно:
    <​значимое выражение​> ​>= <​нижняя граница​> AND
    <​значимое выражение​> <​= <​верхняя граница​>

    Эквивалентные конструкции:

    select count(*) from auto where cylnders between 10 and 12;
    
    select count(*) from auto where cylnders​>=10 and cylnders<​=12;
  5. Выражение:

    <​значимое выражение​> 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;
  6. Опция 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|
  7. Опция 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|
  8. По умолчанию (если опции симметричности не заданы) используется ASYMMETRIC.