Предикат соответствия
Функция
Определение условия соответствия проверяемой записи c результатом табличного подзапроса.
Спецификация
::=::=::=::=Синтаксические правила
-
Количество элементов в
< проверяемой записи >должно совпадать с количеством элементов в< сличаемых записях >. -
Типы данных элементов в
< проверяемой записи >должны быть совместимы с типами соответствующих элементов< сличаемых записей >. -
Сравнение пар соответствующих элементов производится аналогично
< предикату сравнения >. -
Опция
UNIQUEзапрещает использовать для проверки совпадения дубликаты< сличаемых записей >. -
Опции
SIMPLE(обычное совпадение),PARTIAL(частичное) иFULL(полное) задают условия совпадения записей, имеющих NULL-значения.
Общие правила
-
< Предикат соответствия >возвращает TRUE, если< проверяемая запись >совпадает по заданному критерию с одной из< сличаемых записей >, в противном случае – FALSE (таблица 1).
| Тип совпадения | Проверяемая запись | Опция UNIQUE | Результат |
|---|---|---|---|
| SIMPLE или не задан | Содержит только NULL-значения | Задана | TRUE |
| Не задана | TRUE | ||
| Содержит реальные и NULL-значения | Задана | TRUE | |
| Не задана | TRUE | ||
| Содержит реальные значения | Задана | TRUE, если среди < сличаемых записей > есть уникальная запись, совпадающая с < проверяемой записью >, иначе FALSE | |
| Не задана | TRUE, если среди < сличаемых записей > есть, возможно, не уникальная запись, совпадающая с < проверяемой записью >, иначе FALSE | ||
| PARTIAL | Содержит только NULL-значения | Задана | TRUE |
| Не задана | TRUE | ||
| Содержит реальные и NULL-значения | Задана | TRUE, если среди < сличаемых записей > есть уникальная запись, реальные значения которой совпадают с соответствующими реальными значениями < проверяемой записи >, иначе FALSE | |
| Не задана | TRUE, если среди < сличаемых записей > есть, возможно, не уникальная запись, реальные значения которой совпадают с соответствующими реальными значениями < проверяемой записи >, иначе FALSE | ||
| FULL | Содержит только NULL-значения | Задана | TRUE |
| Не задана | TRUE | ||
| Содержит реальные и NULL-значения | Задана | FALSE | |
| Не задана | FALSE | ||
| Содержит реальные значения | Задана | TRUE, если среди < сличаемых записей > есть уникальная запись, полностью совпадающая c < проверяемой записью >, иначе FALSE | |
| Не задана | TRUE, если среди < сличаемых записей > есть, возможно, не уникальная запись, полностью совпадающая c < проверяемой записью >, иначе FALSE |
Примеры
-
create or replace table t1 (i1 int, i2 int, i3 int); create or replace table t2 (i1 int, i2 int, i3 int); insert into t1 (i1,i2,i3) values (1,2,3); insert into t1 (i1,i2,i3) values (1,2,4); insert into t1 (i1,i2,i3) values (1,1,3); insert into t1 (i1,i2,i3) values (1,2,3); insert into t1 (i1,i2,i3) values (1,2,5); insert into t2 (i1,i2,i3) values (1,2,3);
-
Эти 3 запроса идентичны:
select count(*) from t1 where (1,2,3) match (select * from t2); select count(*) from t1 where (1,2,3) match (values (1,2,3)); select count(*) from t1 where (1,2,3) match (table t2); | 5|
-
select count(*) from t1 where (t1.i1,t1.i2,t1.i3) match (select * from t2); | 2|
-
select count(*) from t1 where (t1.i1,t1.i2,t1.i3) not match (select * from t2); | 3|
-
select count(*) from t1 where (t1.i1,t1.i2,t1.i3) match full (select * from t2); | 2|
-
Эти 3 запроса идентичны:
select count(*) from t1 where (t1.i1,t1.i2,t1.i3) match partial (select * from t2); select count(*) from t1 where (t1.i1,t1.i2,t1.i3) match partial (values (cos(0),2,sqrt(9))); select count(*) from t1 where (t1.i1,t1.i2,t1.i3) match partial (table t2); | 2|
-
select count(*) from t1 where (t1.i1,t1.i2,t1.i3) match unique (select * from t2); | 2|
-
select count(*) from t1 where (1,NULLIF(0,0),3) match FULL (select * from t2); | 0|
-
select count(*) from t1 where (1,NULLIF(0,0),3) match simple (select * from t2); | 5|
-
select count(*) from t1 where (1,NULLIF(0,0),3) match partial (select * from t2); | 5|
-
create or replace table emp(emp_no int, dept_no int, emp_surname char(50), emp_name char(50)); insert into emp values (1,1,'ИВАНОВ','ИВАН'); insert into emp values (2,NULL,'ПЕТРОВ','ПЕТР'); insert into emp values (3,1,'ПУПКИН','ВАСИЛИЙ'); insert into emp values (4,1,'ИВАНОВ','СЕРГЕЙ'); insert into emp values (5,2,'СИДОРОВ','АНТОН');
Запрос вернет данные о служащих, которые:
-
либо не приписаны к какому-нибудь отделу;
-
либо в своем отделе имеют однофамильцев.
select emp_surname, dept_no
from emp
where (dept_no, emp_surname) match unique simple
(select emp1.dept_no, emp1.emp_surname
from emp emp1
where emp1.emp_no < > emp.emp_no);