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

Функция

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

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

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

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

    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|
  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.