Вы можете использовать индекс функции (по умолчанию NULL
значение для индекса одного столбца пропускается):
CREATE UNIQUE INDEX IX_name
ON project_labor (CASE WHEN STATUS='complete' THEN NULL ELSE LABOR_ID END);
ДБ <> Fiddle demo
Полный скрипт:
CREATE TABLE project_labor(PROJECT_NO INT, LABOR_ID INT, STATUS VARCHAR2(10));
CREATE UNIQUE INDEX IX_name
ON project_labor (CASE WHEN STATUS='complete' THEN NULL ELSE labor_id END);
INSERT INTO project_labor(project_no,status,labor_id) VALUES(1, 'uncomplete', 1);
INSERT INTO project_labor(project_no,status,labor_id) VALUES(2, 'uncomplete', 1);
-- ORA-00001: unique constraint (IX_NAME) violated
INSERT INTO project_labor(project_no,status,labor_id) VALUES(3, 'complete', 2)
INSERT INTO project_labor(project_no,status,labor_id) VALUES(4, 'complete', 2)
SELECT * FROM project_labor
Это эквивалент частичного индекса из других СУБД:
PostgreSQL - частичный индекс / SQLite - частичный индекс / SQL Server - отфильтрованный индекс