Även om jag inte har Oracle gjorde jag ett snabbtest med PostgreSQL och ditt första exempel (IS_DISABLED
är NULL
och DISABILITY_INCOME_TYPE_ID
är 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)
Här ser vi tydligt att i det här fallet returnerar ditt uttryck (åtminstone på PostgreSQL) NULL. Från handboken ,
Så om Oracle beter sig på samma sätt som PostgreSQL, skulle kontrollbegränsningen passas .
För att se om detta är fallet, undvik NULL-skickligheterna genom att explicit kolla efter det och se om det fungerar:
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));