Предикат различимости
Функция
Определение предиката различимости двух записей.
Спецификация
::=
::=
::=
::=
::=
::=
Синтаксические правила
-
< Проверяемая запись >
и< сличаемая запись >
должны быть одинаковой степени и иметь совместимые типы данных.select model from auto where (1, 2, 3) is not distinct from (0+1,4-2,sqrt(9)) limit 2; |MERCURY COMET GT V8 | |A-310 |
Общие правила
-
< Проверяемая запись >
с именами столбцов c1,c2,...,cn и< сличаемая запись >
с именами столбцов d1,d2,...,dn считаются записями-дубликатами, если для каждого i (i=1,2,...,n):-
ci и di не содержат NULL-значения, а их реальные значения равны;
-
ci и di содержат NULL-значения.
create or replace table auto_old (make char(20), color char(10)); insert into auto_old(make, color) values ('FORD', 'RED'); insert into auto_old(make, color) values ('FORD', 'GREEN'); select count(model) from auto as a, auto_old as o where (a.make,a.color) is not distinct from (o.make, o.color); | 10|
create or replace table auto_old (personid int, make char(20), color char(10)); insert into auto_old(personid, make, color) values (1, 'FORD', 'RED'); insert into auto_old(personid, make, color) values (134, 'FORD', 'GREEN'); select count(model) from auto as a, auto_old as o where (a.make, a.color) is distinct from (o.make, o.color) and a.personid=o.personid; | 2|
-
-
Предикат возвращает значение TRUE в том и только в том случае, когда
< проверяемая запись >
и< сличаемая запись >
не являются дубликатами. В противном случае значением предиката является FALSE. -
Если предикат
DISTINCT
содержит модификаторNOT
, то предикат(< проверяемая запись >) IS NOT DISTINCT FROM (< сличаемая запись >)
эквивалентенNOT (< проверяемая запись >) IS DISTINCT FROM (< сличаемая запись >)
.Эти конструкции эквивалентны:
select count(model) from auto where (make,color) is not distinct from values('FORD', 'RED');
select count(model) from auto where not (make,color) is distinct from values('FORD', 'RED'); | 5|
Пример
Найти отделы, руководители которых не являются тёзками Петрова Петра.
create or replace table dept(dept_no int, boss_surname char(10), boss_name char(10)); insert into dept values (1,'ИВАНОВ','ИВАН'); insert into dept values (2,'ПЕТРОВ',NULL); insert into dept values (3, NULL, NULL); insert into dept values (4,'ПУПКИН','ВАСИЛИЙ'); insert into dept values (5,'ПЕТРОВ','ПЕТР'); insert into dept values (6, NULL, NULL);
Результаты нижеследующих запросов идентичны:
select dept_no from dept where ('ПЕТРОВ','ПЕТР') is distinct from (boss_surname,boss_name); select dept_no from dept where (boss_surname, boss_name) is distinct from (select boss_surname, boss_name from dept where boss_surname='ПЕТРОВ' and boss_name='ПЕТР'); ------- | 1| | 2| | 3| | 4| | 6|