Въпреки че нямам Oracle, направих бърз тест с PostgreSQL и вашия първи пример (IS_DISABLED
е NULL
и DISABILITY_INCOME_TYPE_ID
е 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)
Тук виждаме ясно, че в този случай вашият израз (поне на PostgreSQL) връща NULL. От ръководството ,
Така че, ако Oracle се държи по същия начин като PostgreSQL, ограничението за проверка ще премине .
За да видите дали това е така, избягвайте NULL шенаниганите, като изрично ги проверите и вижте дали работи:
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));