Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Restrição de verificação do Oracle


Embora não tenha Oracle, fiz um teste rápido com PostgreSQL e seu primeiro exemplo (IS_DISABLED sendo NULL e DISABILITY_INCOME_TYPE_ID sendo 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)

Aqui vemos claramente que, neste caso, sua expressão (pelo menos no PostgreSQL) retorna NULL. Do manual ,

Portanto, se o Oracle se comportar da mesma forma que o PostgreSQL, a restrição de verificação passará .

Para ver se esse é o caso, evite as travessuras NULL verificando explicitamente e veja se funciona:
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));