В дополнение к решению Gordon я могу предложить использовать типы объектов oracle с пользовательской логикой сравнения для обработки проблемы сравнения NULL:
CREATE OR REPLACE TYPE test_obj as object(
company varchar2(100),
material varchar2(100),
property varchar2(100),
condition varchar2(100),
map member function get_unique_key return varchar2
)
/
CREATE OR REPLACE TYPE BODY test_obj as
map member function get_unique_key return varchar2
as
begin
return nvl(company,'?')||'|'||nvl(material,'?')||'|'||nvl(property,'?')||'|'||nvl(condition,'?');
end;
end;
/
DROP TABLE all_tests;
CREATE TABLE all_tests
(
test VARCHAR2(100),
test_obj TEST_OBJ
)
;
insert into all_tests
select 'TEST1', test_obj('XXX', null, 'test', null)
from dual
;
select * from all_tests
where test_obj = test_obj('XXX', null, 'test', null);
TEST TEST_OBJ
------ --------------
TEST1 (XXX, , test, )