Anche se non ho Oracle, ho fatto un rapido test con PostgreSQL e il tuo primo esempio (IS_DISABLED
essendo NULL
e DISABILITY_INCOME_TYPE_ID
essendo 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)
Qui vediamo chiaramente che, in questo caso, la tua espressione (almeno su PostgreSQL) restituisce NULL. Da il manuale ,
Quindi, se Oracle si comporta come PostgreSQL, il vincolo check supera .
Per vedere se questo è il caso, evita gli shenanigan NULL controllandolo esplicitamente e verifica se funziona:
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));