Selvom jeg ikke har Oracle, lavede jeg en hurtig test med PostgreSQL og dit første eksempel (IS_DISABLED
er NULL
og DISABILITY_INCOME_TYPE_ID
er 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)
Her ser vi tydeligt, at i dette tilfælde returnerer dit udtryk (i hvert fald på PostgreSQL) NULL. Fra manualen ,
Så hvis Oracle opfører sig på samme måde som PostgreSQL, ville kontrolbegrænsningen bestå .
For at se, om dette er tilfældet, skal du undgå NULL-svindlen ved eksplicit at tjekke efter det og se, om det virker:
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));