I když nemám Oracle, provedl jsem rychlý test s PostgreSQL a vaším prvním příkladem (IS_DISABLED
je NULL
a DISABILITY_INCOME_TYPE_ID
být 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)
Zde jasně vidíme, že v tomto případě váš výraz (alespoň na PostgreSQL) vrací NULL. Z příručky ,
Pokud se tedy Oracle chová stejně jako PostgreSQL, kontrolní omezení by prošlo .
Chcete-li zjistit, zda je to tento případ, vyhněte se NULL podvodům tím, že je explicitně zkontrolujete a uvidíte, zda to funguje:
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));