Hoewel ik Oracle niet heb, heb ik een snelle test gedaan met PostgreSQL en uw eerste voorbeeld (IS_DISABLED
zijnde NULL
en DISABILITY_INCOME_TYPE_ID
zijnde 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)
Hier zien we duidelijk dat, in dit geval, je expressie (tenminste op PostgreSQL) NULL retourneert. Uit de handleiding ,
Dus als Oracle zich hetzelfde gedraagt als PostgreSQL, zou de controlebeperking voldoen .
Om te zien of dit het geval is, vermijd de NULL-shenanigans door expliciet te controleren of het werkt:
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));