Предикат различимости
Функция
Определение предиката различимости двух записей.
Спецификация
::=::=::=::=::=::=Синтаксические правила
-
<Проверяемая запись>и<сличаемая запись>должны быть одинаковой степени и иметь совместимые типы данных.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|