Chociaż nie mam Oracle, zrobiłem szybki test z PostgreSQL i twoim pierwszym przykładem (IS_DISABLED
będąc NULL
i DISABILITY_INCOME_TYPE_ID
będąc 1):
postgres=> select (null is null and 1 is null);
?column?
----------
f
(1 registro)
postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null);
?column?
----------
f
(1 registro)
postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null) or (null = 1);
?column?
----------
(1 registro)
Tutaj widzimy wyraźnie, że w tym przypadku twoje wyrażenie (przynajmniej w PostgreSQL) zwraca NULL. Z instrukcji ,
Tak więc, jeśli Oracle zachowuje się tak samo jak PostgreSQL, ograniczenie sprawdzające przejdzie .
Aby sprawdzić, czy tak jest, unikaj wybryków NULL, wyraźnie sprawdzając, czy to działa:
CHECK ((IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL)
OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 0 AND DISABILITY_INCOME_TYPE_ID IS NULL)
OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 1));