Предикат сравнения

Функция

Определение сравнений двух значений.

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

  2. Результат <​подзапроса​> должен возвращать одну запись (или одно значение, в зависимости от WHERE-условия), в противном случае будет зафиксирована исключительная ситуация.

    select dept_no
      from dept
      where
        (boss_surname, boss_name) = (select boss_surname, boss_name
          from dept
            where dept_no=5);
    select name, make
      from auto, person
     where auto.personid=person.personid
       and salary ​>= (select avg(salary) from person);
  3. Если <​сравниваемое значение1​> или <​сравниваемое значение2​> имеет явное NULL-значение, то результат сравнения «на равенство» будет всегда неизвестен (UNKNOWN, то есть логическое NULL-значение), и такие записи не попадут в выборку данных.

    Сравните:

    select count(*) from auto where NULL = personid;
    
    |    0|
    select count(*) from auto where personid=null;
    
    |    0|
    select count(*) from auto where personid is null;
    
    |    0|
    select count(col1) from sample where col2 is not null;
  4. Хотя сравнение на равенство <​значимых выражений​> не определено, когда оба имеют NULL-значения, тем не менее, в контекстах GROUP BY, ORDER BY и DISTINCT все NULL-значения считаются равными.

  5. Параметрами <​скалярной процедуры​> может быть SELECT-запрос, возвращающий значение требуемого типа.

  6. Если у <​скалярной процедуры​> нет параметров, то необходимо указать пустой список параметров.

    create or replace procedure sp_test() result int
    code
      return 2; //
    end;
    select * from auto where personid = sp_test();
  7. <​Список значений​> может быть списком константных значений и/или имен столбцов.

    select count(*)
      from auto
     where (make, model) = ('GENERAL MOTORS', 'CHEVROLET IMPALA');
    
    |   17|
Общие правила
  1. Числовые значения сравниваются по алгебраическим правилам.

  2. Сравнение типов данных NCHAR (VARCHAR) выполняется по весам символов, а не в порядке возрастания их кодов.

    select count(*)
      from auto
     where (year+1900, color) ​> (1971, 'BLACK');
    
    |           392|
  3. Если значения типа CHAR, BYTE, NCHAR имеют разную длину, то сравнение производится посредством временного дополнения короткого значения справа до размера длинного значения. Символами дополнения являются пробел для символьного значения и двоичный нуль – для байтового.

  4. Если значения типа VARCHAR, VARBYTE, NCHAR VARYING имеют разную длину, то сравнение выполняется по длине значения.

  5. Два значения равны, если все символы (байты) в одних и тех же позициях значения равны. Если два значения не равны, отношение между ними определяется сравнением первой пары неравных символов.

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

    Запрос вида:

    SELECT * FROM T WHERE B;

    идентичен запросу:

    SELECT * FROM T WHERE B = 'TRUE';
  7. Для столбцов c типом данных BLOB запрещено:

    • сравнение значений;

    • присвоение значения одного столбца из БД другому столбцу.

  8. Для столбцов c типом данных EXTFILE запрещено сравнение значений.

  9. Для столбцов типа EXTFILE разрешено сравнение результата функции.

    create or replace table tst (i int, extf extfile);
    insert into tst(i,extf) values (1, extfile('c:/config.sys'));
    insert into tst(i,extf) values (2, extfile('d:/Linter.doc'));
    insert into tst(i,extf) values (3, extfile('d:/proc.doc'));
    insert into tst(i,extf) values (2, extfile('e:/linter/'));
    insert into tst(i,extf) values (2, extfile('e:/linter/'));
    --
    select count(i)
      from tst
     where trim(filename(extf)) = 'e:\linter/';
    
    | 2|

    Примечание

    Функция filename(0) возвращает имя внешнего файла (см. документ «Полнотекстовый поиск в базе данных»), пункт «Путь к внешнему файлу».

    select i
      from tst
     where trim(filename(extf)) like '%doc%';
    
    | 2|
    | 3|
  10. Предикат сравнения (кроме IS NULL и IS NOT NULL) всегда возвращает NULL-значение, если хотя бы один из операндов равен NULL. В результате такие записи не попадают в выборку.

  11. Следует различать <​предикат сравнения​> для списка значений с <​предикатом дубликата значения​>. В <​предикате дубликата значения​> NULL-значения сравниваемых значений считаются равными, а в <​предикате сравнения​> – нет (т.к. в этом случае предполагается арифметическое сравнение значений).

    Сравните результаты:

    select count(*) from auto
     where (1,2,nullif(0,0))=(1,2,nullif(0,0));
    
    |    0|
    select count(*) from auto
      where (1, 2, nullif(0,0)) is not distinct
      from (1, 2, nullif(0,0));
    
    |    1000|