Предикат сравнения
Функция
Определение сравнений двух значений.
Спецификация
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
Синтаксические правила
-
Типы данных
< сравниваемого значения1 >
и< сравниваемого значения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);
-
Если
< сравниваемое значение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;
-
Хотя сравнение на равенство
< значимых выражений >
не определено, когда оба имеют NULL-значения, тем не менее, в контекстахGROUP BY
,ORDER BY
иDISTINCT
все NULL-значения считаются равными. -
Параметрами
< скалярной процедуры >
может быть SELECT-запрос, возвращающий значение требуемого типа. -
Если у
< скалярной процедуры >
нет параметров, то необходимо указать пустой список параметров.create or replace procedure sp_test() result int code return 2; // end; select * from auto where personid = sp_test();
-
< Список значений >
может быть списком константных значений и/или имен столбцов.select count(*) from auto where (make, model) = ('GENERAL MOTORS','CHEVROLET IMPALA'); | 17|
Общие правила
-
Числовые значения сравниваются по алгебраическим правилам.
-
Сравнение типов данных
NCHAR
(VARCHAR
) выполняется по весам символов, а не в порядке возрастания их кодов.select count(*) from auto where (year+1900, color) > (1971, 'BLACK'); | 392|
-
Если значения типа
CHAR
,BYTE
,NCHAR
имеют разную длину, то сравнение производится посредством временного дополнения короткого значения справа до размера длинного значения. Символами дополнения являются пробел для символьного значения и двоичный нуль – для байтового. -
Если значения типа
VARCHAR
,VARBYTE
,NCHAR VARYING
имеют разную длину, то сравнение выполняется по длине значения. -
Два значения равны, если все символы (байты) в одних и тех же позициях значения равны. Если два значения не равны, отношение между ними определяется сравнением первой пары неравных символов.
-
Скалярное выражение типа
BOOLEAN
, при необходимости, автоматически преобразуется в предикат.Запрос вида:
SELECT * FROM T WHERE B;
идентичен запросу:
SELECT * FROM T WHERE B = 'TRUE';
-
Для столбцов c типом данных
BLOB
запрещено:-
сравнение значений;
-
присвоение значения одного столбца из БД другому столбцу.
-
-
Для столбцов c типом данных
EXTFILE
запрещено сравнение значений. -
Для столбцов типа
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/')); // В среде Windows 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|
-
Предикат сравнения (кроме
IS NULL
иIS NOT NULL
) всегда возвращает NULL-значение, если хотя бы один из операндов равен NULL. В результате такие записи не попадают в выборку. -
Следует различать
< предикат сравнения >
для списка значений с< предикатом дубликата значения >
. В< предикате дубликата значения >
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|